在調試我的代碼時,我發現我的程序在清理過程中經常崩潰。通過添加一些printf
聲明,我很快發現該程序在對free
(其中有多個,但它總是會在其中一個崩潰)調用時不斷崩潰。打電話給空閒塊
我#define
倒是free
,calloc
,malloc
和realloc
,把他們在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
但它是一個有效的指針?如果你重新分配了一些東西,你必須確保** no **其他指針指向舊的內存塊。 – StoryTeller
加載調試器的時間。 –
@StoryTeller你究竟是什麼意思?我做了'void * old = ptr; ptr = realloc(ptr,size); if(ptr == NULL){ptr = old;返回1; } return 0;' – YoYoYonnY