關於linux 記憶體重複釋放的問題
阿新 • • 發佈:2019-01-02
記憶體申請函式malloc,對應的釋放函式為free,多次釋放會造成系統未知問題,鑑於free對指標指向NULL的指標釋放後不會有任何操作,因此有必要在釋放後將指標清0。但有時候將指標傳給其它函式時,比如被其它函式呼叫後再釋放就可能要注意點,如下函式
上面這段程式會造成段錯誤,造成段錯誤的地方是第二次的FREE_MEM,雖然在釋放前有判斷指標p是否為空,你可能會覺得testfunc(p)已經將p指標置為空了,但實際是沒有,testfunc中引數p有指向Main中的p,但這兩個p並非同一個p#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; }
解決方法就是要利用雙指標才能真正改變main中的p.
將testfunc改成如下
void testfunc(char **p)
{
FREE_MEM(*p);
return ;
}