2011-10-21 41 views
3

我目前(不要問爲什麼:P)實現我自己的版本的malloc()和free(),並且爲了當前的調試目的故意在free()的第一行放置一個斷言(0)。C語言:在「assert()」失敗後,程序如何繼續運行一點點?

驅動程序正在測試這些malloc()和free()的隨機序列以測試我的實現的正確性。

當我運行驅動程序,但是,外殼打印出的是「斷言‘0’失敗」,一直運行了很長一點,然後打印「胎死腹中」。實際上,它似乎可以在報告斷言失敗並最終報告程序已中止之間多次調用malloc()。我確信這是因爲我已經在代碼中放置了某些printf語句來打印出某些用於調試目的的變量。

我不要求任何幫助在所有有關實現的malloc()和free()。只要知道程序繼續運行很短的時間(即使可能調用其他用戶定義的函數),即使斷言已報告失敗後,也意味着什麼。

回答

7

如果您看到「斷言失敗」,然後調試打印,然後退出,則有兩種明顯的可能性。

一個是斷言消息和調試打印進入兩個不同的緩衝輸出流(例如stderr和stdout),它們沒有按照它們被填充的相同順序進行刷新。

另一個是多個執行線程正在碰到malloc()。

+0

我很確定驅動程序不是' t多線程...... –

+1

驅動程序?你能澄清你的平臺嗎? –

3

如果你是一個基於glibc的系統上,這個問題可能是fprintf調用malloc內部,並assert反過來使用fprintf打印斷言失敗消息。這當然是一個非常糟糕的設計,因爲來自內存不足條件的打印錯誤消息總是會失敗(在許多其他問題中),但這就是它的原因......

相關問題