2011-04-06 207 views
1

我寫作mallocfree包裝實驗,我不知道爲什麼下面的代碼提供了錯誤pointer being freed was not allocated,爲什麼不delete()工作?`免費()`包裝

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

#define log(v) printf(#v " == %d \n", v) 
#define new(n, type) _new((n), sizeof(type), __LINE__, __FILE__) 

void *_new(int n, size_t size, int line, char *file) 
{ 
    int *ptr; 
    ptr = malloc(n * size); 

    if (ptr == NULL) 
    { 
     printf("new(): Memory allocation error, file \"%s\", line %d. \n", file, line); 
     exit(EXIT_FAILURE); 
    } 

    return ptr; 
} 

void delete(int *ptr) 
{ 
    free(*ptr); 
    *ptr = NULL; 
} 


main() 
{ 
    int *p; 

    p = new(1, int); 
    log(p); 

    delete(&p); 
    log(p); 
} 
+2

邊注:只是要小心你不嘗試在C編譯此++編譯器... – Mehrdad 2011-04-06 22:24:12

+1

你的代碼是不是編譯。如果您的編譯器的錯誤檢查足夠鬆散以接受此代碼,則至少必須針對代碼中存在的嚴重錯誤發出一些警告。在解決這些錯誤之前,分析代碼的行爲沒有多大意義。你現在擁有的僅僅是無用的指針操作的無意義混亂。 – AnT 2011-04-06 22:30:54

+0

@Mehrdad:或者就此而言,C編譯器,因爲它使用標識符_new,它在文件範圍保留。 – 2011-04-06 23:36:56

回答

5

既然你,

int *p; 
p = new(1, int); 
delete(&p); 

那麼你應該

void delete(int** ptr) //two ** here!! 
{ 
    free(*ptr); 
    *ptr = NULL; 
} 
+1

在旁註:嘗試查看編譯器的警告。有時他們有用':)' – Muggen 2011-04-06 22:31:55

0

free()荷蘭國際集團的指針指向( *ptr)的事情,而不是指針 ptr本身。 錯過&調用delete();抱歉。

+0

這是正確的,因爲調用是'刪除(&p);' – aschepler 2011-04-06 22:26:59

+0

@aschepler,只表示'delete'的特定用法沒問題,它的定義仍然不正確。 – JaredPar 2011-04-06 23:27:12

-1

問題是此行

free(*ptr); 

free函數需要一個指針值,但你給它一個int代替。試試這個

free(ptr); 

編輯

爲什麼downvotes? delete函數在使用free時是不正確的,我的陳述是正確的。 delete的具體不正確使用使得所有這些工作都有效(它的正確性取決於平臺)並不會使我的答案不正確。