程序結束後,malloc申請的內存會被釋放掉嗎

1,有這麼一個問題,下面這段程序執行完畢後,malloc的內存會釋放嗎?

int main () {
  int *p = malloc(10 * sizeof *p);
  *p = 42;
  return 0;  //Exiting without freeing the allocated memory
}

  這段程序運行完後,p 申請的malloc地址會被釋放掉嗎? 會的。

The Linux Programming Interface書中有這麼一段:

When a process terminates, all of its memory is returned to the system, including heap memory allocated by functions in the malloc package. In programs that allocate memory and continue using it until program termination, it is common to omit calls to free(), relying on this behavior to automatically free the memory.  This can be especially useful in programs that allocate many blocks of memory, since adding multiple calls to free() could be expensive in terms of CPU time, as well as perhaps being complicated to code.
 

2,分析

每一個進程都運行在一個獨立的4GB“地址空間”當中
這個4G只是邏輯上的,物理內存不可能有這麼多,
這個“地址空間”中,內核佔掉了高位的2G, 用戶就用低位的2G 了,用malloc 來管理
在用戶程序的堆中分配一個指定大小的空間,並告訴系統的內存管理模塊:“我要使用這塊空間!”
那麼,系統的內存管理模塊究竟做了些什麼呢?
熟悉Intel 80x86編程的人應該容易理解,它其實只做一件事:把應用程序的虛擬地址空間映射到真實的物理地址(或者磁盤上的分頁文件)
所以說,不管用戶程序怎麼malloc,在進程結束的時候,其虛擬地址空間就會被直接銷燬,操作系統只需要在進程結束的時候
讓內存管理模塊把分頁文件中與此進程相關的記錄全部刪除,標記爲“可用空間”,
就可以使所有申請的內存都一次性地回收,根本沒有什麼麻煩.

簡單說,malloc 的分配都是假的,malloc 的請求系統都知道,程序退出時,系統會回收malloc 的所有資源
 

3,free後指針怎麼辦?

    別看 free 和delete 的名字惡狠狠的(尤其是delete),它們只是把指針所指的內存給釋放掉,但並沒有把指針本身幹掉。
    用調試器跟蹤示例程序,發現指針p 被free 以後其地址仍然不變(非NULL),只是該地址對應的內存是垃圾,p 成了“懸空指針”。如果此時不把p 設置爲NULL,會讓人誤以爲p 是個合法的指針。
    如果程序比較長,我們有時記不住p 所指的內存是否已經被釋放,在繼續使用p 之前,通常會用語句if (p != NULL)進行防錯處理。很遺憾,此時if 語句起不到防錯作用,因爲即便p 不是NULL 指針,它也不指向合法的內存塊。
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的內存被釋放,但是p 所指的地址仍然不變,指針值還是那個地址,但已經不指向它了,再賦值會出錯。

if(p != NULL) // 沒有起到防錯作用
{
strcpy(p, “world”); // 出錯
}

 

野指針:未初始化的指針;

懸空指針:free後,未置空的指針。

https://www.cnblogs.com/idorax/p/6475941.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章