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

时间:2011-09-14 09:24:25

标签: c++ memory-leaks exit

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

我应该怎么做以防止这些内存泄漏? 谢谢!

4 个答案:

答案 0 :(得分:7)

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

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

出于这个原因,

exit与c ++的搭配并不是很好。你最好只允许你的程序从main返回到exit,或者你需要退出内部函数而不是抛出异常,这将导致调用堆栈展开,从而调用析构函数。

答案 1 :(得分:6)

使用exit函数时,程序将终止,并且将释放它分配的所有内存。没有内存泄漏。

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

EDIT2:

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

您没有真正的内存泄漏。程序终止时,操作系统释放程序使用的所有内存。