2011-10-21 40 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打印断言失败消息。这当然是一个非常糟糕的设计,因为来自内存不足条件的打印错误消息总是会失败(在许多其他问题中),但这就是它的原因......

相关问题