[英]Why do I have to deallocate the pointer after using it??? (ANSI-C)
我讀到這個: http://www.drpaulcarter.com/cs/common-c-errors.php#2.8並且有這樣的代碼塊:
#include <string.h>
#include <stdlib.h>
int main()
{
char *st = malloc(20); /* st points to allocated array*/
strcpy(st, "abc"); /* st points to char array */
free(st); /* don't forget to deallocate when done! */
return 0;
}
在大多數理智的操作系統上,您實際上不必在退出時進行清理——這只是一個好習慣。
該代碼只是分配和釋放 memory 的簡化示例,在實際程序中,您將跟蹤在程序運行時需要釋放的 memory,否則您將用完 ZCD69B4957F06CD818D7BF3D61980(更可能的地址空間)
您必須釋放它(通過free()
),因為您分配了它(通過malloc()
)。 在大多數 C API 中,如果分配指針,通常您負責釋放它。 在某些情況下這是不正確的,但函數的手冊頁通常會指定這一點。
分配和解除分配 memory 的效果。 一旦您出於某種目的分配了 memory,它就會一直保持分配狀態,直到您解除分配。 雖然已分配,但不可用於其他目的。 釋放它的原因是為了使 memory 可用於其他用途。
為什么這很重要。 如果您的程序隨着時間的推移繼續分配新的 memory 塊,這將變得很重要。 如果您不再需要 memory 時不釋放它,那么您的程序對 memory 的使用會越來越大,並且可能最終會耗盡操作系統提供給它的 ZCD69B4957F06CD818D7BF3D61980E2 的池。
在這個例子中沒有真正的傷害。 在您的特定示例中,跳過解除分配(可能)沒有害處。 一方面,該程序隨后立即結束,因此該程序不再用於該 memory。 另一方面,正如其他人所提到的,在 C 的典型實現中,您的程序在退出時會返回其所有 memory。
但是,如果您的程序可能需要 memory 來做其他事情,或者如果您的程序在退出時不會將 memory 還給操作系統,那么在您不再需要它時釋放 ZCD69B4957F06CD818D7BF3D61980 是個好主意。
memory,而不是指針,被釋放。 嚴格來說,該示例不會釋放指針。 它釋放指針指向的 memory。 指針仍然存在,實際上仍然指向現在釋放的 memory。 如果您無意中繼續使用指針,就好像它仍然指向它擁有的 memory 一樣,這可能會導致無窮無盡的調試樂趣。
不能保證分配的 memory 將 go 僅僅因為進程終止而返回系統的資源。
在 main() function 中,一旦程序退出,所有分配的 memory 都會返回給操作系統,即使您沒有顯式取消分配它。 因此,手動進行通常被稱為一種良好做法,這種“良好做法”具有實際意義。 如果您將此代碼放在另一個 function 中,甚至在 main 中並在循環中,您的程序將根據代碼分配和釋放 memory。 如果您將代碼放在一個循環中並且沒有釋放,這最終會吃掉您所有的 memory,導致您的程序崩潰,除非處理。 在某些情況下,這稱為 memory 泄漏。 所以,好好了解一下好的做法吧! Memory 泄漏
否則 C memory 分配器不知道您已完成使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.