簡體   English   中英

為什么我必須在使用后釋放指針??? (ANSI-C)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM