假设我们有一个程序,我们分配一些内存,然后我们有一些断言语句。如果断言语句抛出错误,分配的内存会发生什么?在停止程序之前它是免费的吗?
答案 0 :(得分:8)
assert
失败时,将错误写入 stderr 并调用 abort() 。与 exit()不同,它不会执行使用 atexit() 注册的函数,也不会调用析构函数。
因此,你的析构函数,清理代码等都不能被调用。因此,在“意外”终止之前,由程序释放内存并取决于操作系统。
这可能是设计,因为调用析构函数可能会导致一些进一步的错误。它终止于失败的断言,不再执行代码。
答案 1 :(得分:4)
当assert
失败导致你的程序失效时,内存会保持分配状态。
作为破坏过程的一部分,任何现代桌面操作系统都将回收内存。某些嵌入式操作系统可能无法执行此操作,但我手边没有名称。
您可以使用Valgrind等实用程序以这种方式检测操作系统必须回收的内存。