2016-04-24 139 views
0

在調試我的代碼時,我發現我的程序在清理過程中經常崩潰。通過添加一些printf聲明,我很快發現該程序在對free(其中有多個,但它總是會在其中一個崩潰)調用時不斷崩潰。打電話給空閒塊

#define倒是freecallocmallocrealloc,把他們在config.h,讓他們打印出他們在那裏做什麼,與+malloc<>realloc-free

這些結果如下:

+ 00a92570 
< 00a92570 
> 00a93980 
< 00a93980 
> 00a93980 
< 00a93980 
> 00a94988 
< 00a94988 
> 00a96990 
< 00a96990 
> 00950048 
+ 00a92570 
+ 00958050 
+ 00958458 
- 00958458 

在另一方面來看,幾乎完成了計劃,但未能在最後一行:

+ 00ac2570 
< 00ac2570 
> 00ac3980 
< 00ac3980 
> 00ac3980 
< 00ac3980 
> 00ac4988 
< 00ac4988 
> 00ac6990 
< 00ac6990 
> 00960048 
+ 00ac2570 
+ 00968050 
+ 00968458 
- 00968458 
- 00968050 
- 00ac2570 
- 00960048 

這些都是我的字符串庫的所有呼叫。首先你看到我的程序加載到一個文本文件中,然後你看到它爲我想分析的令牌分配緩衝區(讓我們假裝它是Name,Age,Adress)。處理完文件後,清理過程開始。令我困擾的是,明確free運行在一個有效的指針,所以它爲什麼崩潰?當你傳遞一個有效的指針時,free會崩潰嗎?我是在Windows 10和用gcc 4.9.3

+0

但它是一個有效的指針?如果你重新分配了一些東西,你必須確保** no **其他指針指向舊的內存塊。 – StoryTeller

+2

加載調試器的時間。 –

+0

@StoryTeller你究竟是什麼意思?我做了'void * old = ptr; ptr = realloc(ptr,size); if(ptr == NULL){ptr = old;返回1; } return 0;' – YoYoYonnY

回答

1

如果您在免費崩潰(編譯),可能的原因是:

  1. 多次調用釋放對同一個塊。
  2. 使用未分配的塊使用malloc調用釋放()& Co.
  3. 使用已損壞的塊進行免費調用。

您描述的隨機行爲典型的這種類型的問題。

你最好打賭它嘗試使用調試malloc /免費實現。

+0

一塊內存怎麼會損壞?我寫了一個內存緩衝區以外的內存,這是否算作腐敗? – YoYoYonnY

+1

是的,就是這樣。塊通常是它發生的方式。但是,當您通過一個塊寫入另一個塊時也可能發生這種情況。 – user3344003