2011-12-26 50 views

回答

5

我想明顯的答案是,結構中的泄漏是當指向分配內存的指針駐留在結構中並且結構在其成員指向的內存被釋放之前超出範圍時。這將通過釋放結構內部指向的任何內存,然後釋放(或放棄示波器)結構來解決。

敢肯定這是這個問題是問什麼... :)

1

重要的一點要記住的是:

動態內存總是被分配以及釋放明確。

每當你使用malloc分配給一個指針內存,並沒有專門調用free對同一指針/傳遞同一地址free它導致泄漏

在結構的情況下,內存,只要你有一個使用malloc分配動態內存的指針成員,那麼它應該明確free通過調用free未能這樣做會導致內存泄漏。

An Code Example:

#include<stdio.h> 
#include<string.h> 
#include <stdlib.h> 

struct MyStruct 
{ 
    char *str; 
    int i; 
}; 

int main() 
{ 
    struct MyStruct *ptr = (struct MyStruct *)malloc(sizeof(*ptr)); 
    ptr->i = 10; 
    /*str is allocated dynamic memory*/ 
    ptr->str = malloc(10); 

    strncpy(ptr->str,"Hello",6); 

    printf("[%d]",ptr->i); 
    printf("[%s]",ptr->str); 


    /*Frees memory allocated to structure*/  
    /*But Oops you didn't free memory allocated to str*/ 
    /*Results in memory leak*/ 
    //free(ptr); 

    /*Correct order of deallocation*/ 
    /*free member memory*/ 
    free(ptr->str); 
    /*free structure memory*/ 
    free(ptr); 


    return 0; 
} 
+0

我知道你只是試圖清楚OP,但明確的部分是錯誤的。例如,很多庫malloc的內存,並要求「客戶端」釋放該內存。某些集合可能會自動釋放元素,或使用RAII策略(不需要明確的免費通話)。在保守的垃圾收集器中使用C是非常簡單的,在這種垃圾收集器中free沒有被顯式調用。 – Heptic 2011-12-26 11:34:09

+0

@Heptic:明確地說,部分是非常正確的,除非任何使用的api或數據結構另有說明。 – 2011-12-26 11:57:02

1

請看一看Dynamic memory allocation in C

其動態存儲器分配期間發生/免費的常見錯誤如下[其說明here]

不當動態內存分配的使用經常會成爲錯誤的根源。

最常見的錯誤是:

  • 分配失敗:內存分配不能保證成功。如果沒有執行成功分配的檢查,通常會導致程序或整個系統崩潰。
  • 內存泄漏:未能使用free釋放內存導致內存堆積不可重用,內存不再被程序使用。這會浪費內存資源,並在這些資源耗盡時導致分配失敗。
  • 邏輯錯誤:所有分配必須遵循相同的模式:使用malloc分配,用於存儲數據,使用free解除分配。無法遵守此模式,例如免費通話後或在致電malloc後撥打free兩次後的內存使用情況等。通常會導致程序崩潰。

上述內容適用於structures,也適用於C的其他構造。

希望這會有所幫助!