3

假设我们有一个程序,我们在其中分配了一些内存,然后在几行之后有一个断言语句。如果assert语句抛出错误,分配的内存会发生什么?在停止程序之前它会免费吗?

4

2 回答 2

8

assert失败时,将错误写入stderr并调用abort()。与exit()不同,它不执行用atexit()注册的函数,也不调用析构函数。

因此,您的析构函数、清理代码等都不能被调用。所以这取决于操作系统,因为程序在“意外”终止之前没有释放内存。


这可能是设计使然,因为调用析构函数可能会导致一些进一步的错误。它在那个失败的断言处终止,不再执行任何代码。

于 2012-11-09T07:42:39.923 回答
4

assert失败导致您的程序停止运行时,内存保持分配状态。

作为破坏进程的一部分,任何现代桌面操作系统都会回收内存。一些嵌入式操作系统可能无法做到这一点,尽管我手头没有一个名字。

您可以使用 Valgrind 等实用程序以这种方式检测操作系统必须回收的内存。

于 2012-11-09T07:38:54.567 回答