如何防止重覆free()

我最近拿到一個程式用了許多malloc()和free()

但是卻發現程式好多地方會重覆free()同一個記憶體位置導致程式當掉.

請問有沒有什麼辦法可以先檢查指標是不是有效然後再做free()呢?

謝謝囉.

8 Answers

Rating
  • Dave
    Lv 7
    1 decade ago
    Best Answer

    檢查指標是否為 null,不是在 free;並記得每次在 free 後都把指標設為 null…

    // allocate code

    int *a = null;

    a = malloc(...);

    // free code

    if( a )

    {

    free( a );

    a = null;

    }

    2008-02-02 18:58:35 補充:

    也可以把整個 free 包成 macro:

    #define FREE_MEM( ADDR ) if( ADDR ) { free( ADDR ); ADDR = null; }

  • Anonymous
    5 years ago

    到下面的網址看看吧

    ▶▶http://qoozoo09260.pixnet.net/blog

  • novus
    Lv 6
    1 decade ago

    喵喵咪 is right

    基於C語言的機制,並不存在一體通用、一勞永逸的解決方案

    重複free通常可以歸納為兩種肇因

    * 程式配置/釋放的權責不明,使得撰寫者混淆

    * 程式跳脫預設的執行路線 (例如異常處理再加上一些副作用很可能會將程式引到意想不到的路線上)

    第一類的錯誤「理論上」可以靠寫作風格和良好的習慣克服,第二類的錯誤就算在一些成熟的程式庫上也偶有所聞

  • 1 decade ago

    感謝大家的回應.

    我使用的是C語言,

    目前我將指標設為NULL已經不會讓程式當掉.

    不知道是不是有些API目前還沒執行到所以沒出問題,

    但是我已經可以做之後的coding了. 謝謝囉~~~~

  • How do you think about the answers? You can sign in to vote the answer.
  • 1 decade ago

    yes 大大Dave提供的是最直接的好方法 而且不管是什麼OS都一樣好用

    但是要記得 每次free()之後 指標要 = NULL 因為free()之後的指標狀態不一定會變成NULL

  • ?
    Lv 5
    1 decade ago

    free本身會檢查:如果是 NULL,會沒有動作!

    所以,free 完設成 NULL 就夠了!

     (free 不會自動把 free 完的指標設成 NULL!!那部份要我們寫!)

    不用在 free 前加檢查!

    要再保險一點的話,可像 Dave 大一樣:宣告時,直接設定成 NULL

  • 生鏽
    Lv 5
    1 decade ago

    不知道你用的是 C 還是 C++?C++ 的 STL 有一個 auto_ptr 類別就是以 template 達到你要的 smart pointer 功能。

  • SiYu
    Lv 5
    1 decade ago

    基本上C/C++標準library 沒有提供函數有這樣子的功能.

    必須由使用者自行去維護指標指向的address 是否有效.

    且這是一個很麻煩的課題.

    2008-02-04 09:22:53 補充:

    基本上. 這些意見都沒什麼用

    把free 完的point 設成NULL 也只有那個point 變數有效果. 要是有別的point 變數也指向一樣的空間. 再一次free 他也是出問題.

    ex char *p=(char*)malloc(100); char *p2=p;

    free(p); p=NULL; 這時在去用 p2 也會出問題

    由於你跟本不知道別人寫的程式. 到底在那邊用了malloc 出來的memory.. 所以. 這些方法都無法有效解決問題.

    不過把不可用的point 變數設成NULL 確實是一個好習慣

    2008-02-04 09:28:46 補充:

    要解決這個問題.必須要有良好的寫作習慣. 如buffer 空間由呼叫者提供.

    上面有人說使用auto_ptr 在這種情況下就可以使用

    ex void AA(char *pp);

    int xx()

    {

    auto_ptr xx(new char[100]); // 用auto ptr 管理一個memory 空間

    AA(xx.get()); // 呼叫AA 並且提供好空間. 不由AA 自型配置空間

    ...

    ...

    } <<== 離開xx 了. auto_ptr 會自動delete xx 管理的memory

    也許你可以發現 可用xx.get() 取得 xx 維護的空間.

    2008-02-04 09:36:37 補充:

    也就是說. 寫程式的人也可以這樣用

    char *p=xx.get();

    然後他亂稿p .. 如自己free(p) 那auto_ptr 也是會出問題.

    所以. 一開頭我就說了. 必須要有良好的寫作習慣. 遵守一些規則. 否則這個問題. 是很難解決了.

    另一種解決方法寫一個"垃圾收集器回收". 這就是一個大工程. (有別人的library)不過由於C/C++ 程式語言本身並沒有支持這個東西. 你還是一樣要乖乖的. 遵守這個基制的方法.才會正常工作.

Still have questions? Get your answers by asking now.