使用exit(1),c ++时释放内存

yot*_*moo 3 c++ memory-leaks exit

我正在完成一项学校作业,我们被告知每当我们输入错误时,我们应该打印一条消息并退出程序.显然我使用exit(1),但问题是我在使用这个函数时有内存泄漏.我不明白为什么 - 我使用的每个变量都在堆栈而不是堆上.

我该怎么做才能防止那些内存泄漏?谢谢!

Luc*_*ore 7

使用该exit功能时,程序将终止并释放由其分配的所有内存.没有内存泄漏.

编辑:从你的评论中,我可以理解你担心你的对象在终止之前没有被销毁(即他们的析构函数没有被调用).然而,这不构成存储器泄漏,因为存储器由该过程释放并且可供系统使用.如果您指望对象析构函数执行对您的工作流程重要的操作,我建议返回错误代码,而不是使用exit并将该错误代码传播到main().

EDIT2:

根据标准,在销毁具有静态存储持续时间的对象期间调用exit()会导致未定义的行为.你在做吗?

  • @yotamoo你有什么打算"知道肯定"?你在使用某种工具吗? (3认同)

jco*_*der 7

exit 不会调用任何基于堆栈的对象的析构函数,所以如果这些对象在内部分配了任何内存,那么肯定会泄漏内存.

在实践中,它可能无关紧要,因为任何可能的操作系统都会回收内存.但是,如果析构函数应该做任何其他事情你就会遇到问题.

出于这个原因,exit与c ++并没有很好地混合.你最好只允许你的程序从main返回到exit,或者你需要退出内部函数而不是抛出异常,这将导致调用堆栈被解除,因此调用析构函数.


sha*_*oth 5

exit()解决办法是根本不使用。您使用 RAII(使用类进行资源管理)编写程序,并在出现问题时抛出异常。然后,由于调用了析构函数,所有内存都被回收。