天天看點

程序結束後,程序的所有記憶體都将被釋放,包括堆上的記憶體洩露的記憶體

1、程序結束後,程序的所有記憶體都将被釋放,包括堆上的記憶體洩露的記憶體。原因是,當程序結束時,GDT、LDT和頁目錄都被作業系統更改,邏輯記憶體全部消失,可能實體記憶體的内容還在但是邏輯記憶體已經從LDT和GDT删除,頁目錄表全部銷毀,是以記憶體會被全部收回。

2、不管使用者程式怎麼malloc,在程序結束的時候,其虛拟位址空間就會被直接銷毀,作業系統隻需要在程序結束的時候

讓記憶體管理子產品把分頁檔案中與此程序相關的記錄全部删除,标記為“可用空間”,就可以使所有申請的記憶體都一次性地回收,根本沒有什麼麻煩.

簡單說,malloc 的配置設定都是假的,malloc 的請求系統都知道,程式退出時,系統會回收malloc 的所有資源。

但是,有些記憶體系統是回收不了的。

例如運作于核心級的驅動造成的記憶體錯誤等, 這些是系統所管不了的。

這種錯誤,重新開機程式是沒有效果的。必須重新開機電腦才能解決。

舉例:

#include <iostream>  
 const static int const_once = 1024 * 1024 * 10;
int main()
{
    int *a;
    for (int cnt = 0; cnt <= 10; cnt++)
    {
        a = new int[const_once];
        a[10] = 1;
        a[const_once - 10] = 1;
    }
 
    //system("pause");
    //exit(0);
 
    while (1)
    {
        switch (getchar())
        {
        case '1':   //按了鍵盤上的1
            break;
        case '2':
            break;
        case '3':
            break;
        case '4':
            break;
        case '\n':  //按了回車
            exit(0);
        default:
            printf("錯誤輸入!");
            getchar();
        }
    }
 
    return 0;
}

      

使用Windows任務管理器,觀察記憶體的變化。

繼續閱讀