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任務管理器,觀察記憶體的變化。