簡體   English   中英

是否需要釋放函數中的動態指針?

[英]Is It Necessary To Free Dynamic Pointers Within A Function?

我已經在互聯網上閱讀了與此相關的信息。 據我所知,函數中的所有變量僅在函數的生存期內存在,因此這不是必需的。 但是我不確定動態指針數組。

謝謝

您不會釋放指針-它們會自動清除。 您需要釋放的是由malloc獲取的內存。 您使用指針訪問該內存。

簡單地說:從malloc獲得的每個指針都必須完全free一次。 僅此而已。

這取決於指針引用的內存已分配到的位置。 在C中,基本上有2種分配空間的方式。

  1. 使用堆棧:

     void foo(){ int stack_variable = 10; int *stack_pointer = &stack_variable; //bar shouldn't be freed. } 
  2. 使用堆:

     void foo(){ int * heap_pointer = (int *) malloc(sizeof(int)); //heap_pointer need to be freed somewhere } 

在第一種情況下,沒有問題:函數返回時,將釋放堆棧中分配的內存。 即使您使用的是指針,它指向堆棧中的某些數據,也不需要釋放。 當數據本身超出范圍時,請小心不要使用指向堆棧中分配的數據的指針:

int * foo(){
    int stack_variable = 10;
    int *ptr = &stack_variable;
    return ptr;
}
int * ptr = foo(); // you have a problem here: ptr points to a memory region that no longer exist!

在第二種情況下,您正在使用堆,因此需要在某處使用free來顯式釋放它。

如果使用malloc / calloc分配了數據,則需要釋放數據。


由於@Julia Childe的好奇評論而添加的內容:

好吧,分配動態內存的要點是它將一直保留在那里,直到您明確釋放它為止。 這使您可以將指針從函數傳遞到函數,也可以將指針傳遞給函數,並且不受特定函數(即main)的范圍的限制。 因此,您可以在需要時而不是事先為數據分配內存,因此可以分配動態內存。

如果我們沒有此功能,則必須知道編譯時將使用多少內存空間。

希望這能清除一些問號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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