2014-10-27 89 views
1

我一直在使用函數指針和個人項目的結構。當我編譯並運行我的代碼時,當我試圖釋放指針時,出現「中止(核心轉儲)」錯誤。爲什麼釋放指針會導致程序中止?

我有以下代碼(不包括進口):

typedef int (*intFunction)(int,int); 

typedef struct { 
    int value; 
    intFunction func; 
} ValueFunc; 

int addInts(int a, int b){ 
    return a + b; 
} 

int main(){ 
    ValueFunc vf; 
    vf.value = 3; 
    vf.func = &addInts; 
    int y = vf.func(vf.value,4); 
    printf("%i",y); 
    free(vf.func); 
    return 0; 
} 

如果有人可以解釋爲什麼發生這種情況我會非常感激。

+5

您正在嘗試釋放尚未分配的動態過程中的東西給它很可能會失敗的任何錯誤。 – juanchopanza 2014-10-27 16:26:55

+2

您是否嘗試編譯完整的警告?並且從函數指針到'void *'的轉換通過了未標記的?看到這裏:http://coliru.stacked-crooked.com/a/8a9598c6388c6b3a – Deduplicator 2014-10-27 16:29:18

+2

你爲什麼要釋放那個可憐的函數指針? – 2014-10-27 16:31:54

回答

3

您只需要free動態分配的內容(例如,通過使用calloc,malloc或該系列的任何功能)。

你從來沒有分配過內存,所以你不需要釋放它。並且將一個隨機指針傳遞給free函數將使其行爲異常。

0

發現這個:http://bytes.com/topic/c/answers/504956-do-you-have-delete-function-pointer其中一個用戶說:

你不應該刪除函數指針。該函數位於您的可執行文件中的某處,其位置爲 。當您執行程序時,操作系統會將可執行文件加載到內存中。當程序爲函數指針分配一個 值時,它將得到指向您的可執行文件中該函數位置的值 。如果你的程序中刪除了 ,你的編譯器很可能會抱怨你試圖刪除一個不是指針的對象。

...所以即使你的編譯器不執行

相關問題