我正在完成一项学校作业,每当我们有输入时,我们就会被告知 错误我们应该打印一条消息并退出程序。显然我使用exit(1),但是 问题是使用此功能时我有内存泄漏。我不明白为什么 - 我使用的每个变量都在堆栈而不是堆上。
我应该怎么做以防止这些内存泄漏? 谢谢!
答案 0 :(得分:7)
exit 不会调用任何基于堆栈的对象的析构函数,所以如果这些对象在内部分配了任何内存,那么肯定会泄漏内存。
在实践中,它可能无关紧要,因为任何可能的操作系统都会回收内存。但如果破坏者应该做任何其他事情你就会遇到问题......
出于这个原因,exit与c ++的搭配并不是很好。你最好只允许你的程序从main返回到exit,或者你需要退出内部函数而不是抛出异常,这将导致调用堆栈展开,从而调用析构函数。
答案 1 :(得分:6)
使用exit
函数时,程序将终止,并且将释放它分配的所有内存。没有内存泄漏。
编辑:
从你的评论中,我可以理解你担心你的对象在终止之前没有被销毁(即他们的析构函数没有被调用)。然而,这不构成存储器泄漏,因为存储器由该过程释放并且可供系统使用。如果您指望对象析构函数执行对您的工作流程很重要的操作,我建议您返回错误代码而不是使用exit
并将该错误代码传播到main()。
EDIT2:
根据标准,在销毁具有静态存储持续时间的对象期间调用exit()会导致未定义的行为。你在做吗?
答案 2 :(得分:4)
解决方案是根本不使用exit()
。您使用RAII编写程序(使用类进行资源管理)并在出现问题时抛出异常。然后,由于调用析构函数,所有内存都被回收。
答案 3 :(得分:0)
您没有真正的内存泄漏。程序终止时,操作系统释放程序使用的所有内存。