1. 程式人生 > >關於linux 記憶體重複釋放的問題

關於linux 記憶體重複釋放的問題

記憶體申請函式malloc,對應的釋放函式為free,多次釋放會造成系統未知問題,鑑於free對指標指向NULL的指標釋放後不會有任何操作,因此有必要在釋放後將指標清0。但有時候將指標傳給其它函式時,比如被其它函式呼叫後再釋放就可能要注意點,如下函式

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

#define SYS_NULL 0

#define FREE_MEM(x)                     \
{                                       \
    if(SYS_NULL != x) {free(x);x=SYS_NULL;}    \
}                                       

void testfunc(char *p)
{
     FREE_MEM(p);
     return ;
}

int main()
{
    char *p = (char *)malloc(10);
    testfunc(p);
    FREE_MEM(p);

    return 0;
}
上面這段程式會造成段錯誤,造成段錯誤的地方是第二次的FREE_MEM,雖然在釋放前有判斷指標p是否為空,你可能會覺得testfunc(p)已經將p指標置為空了,但實際是沒有,testfunc中引數p有指向Main中的p,但這兩個p並非同一個p

解決方法就是要利用雙指標才能真正改變main中的p.

將testfunc改成如下

void testfunc(char **p)
{
     FREE_MEM(*p);
     return ;
}