【发布时间】:2012-07-30 19:49:56
【问题描述】:
我花了一些时间编写一个应用程序来练习,并且我喜欢在整个过程中使用智能指针,以避免在我忘记删除某些内容时发生内存泄漏。同时,我也喜欢使用异常来报告构造函数中的失败并尝试处理它。但是,当它不能时,我希望它通过调用 assert() 或 exit() 退出该位置的程序。但是,在 msvc 中使用 crtdbg 库时,它会报告来自智能指针的内存泄漏,该智能指针具有动态分配给它们的任何内容。这对我来说意味着两件事之一。 1) 智能指针永远不会超出分配它们的范围,也永远不会释放,从而导致一些内存泄漏,或者 2) crtdbg 没有捕获释放,因为它没有在 main 处退出。不过,从this 页面,使用 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );在程序开始时将捕获任何退出点的泄漏,我仍然使用它得到内存泄漏错误。
所以我向你们提出的问题是,内存实际上会在退出或断言时被释放吗?如果没有,我是否能够从 std::shared_ptr 派生并实现我自己的解决方案来编目要释放的动态分配的对象在调用退出或断言之前,或者对于更简单的解决方案来说工作量太大?
【问题讨论】:
-
如果进程死了,你为什么还要关心释放?
-
如果调用
exit,堆栈不会展开,局部变量不会被破坏。但是,尚不清楚您要完成什么:如果您希望销毁局部变量,请在main()中抛出异常和catch (...)以确保堆栈已展开。 -
@尤里·基洛切克:好问题。有关系吗?当我看到内存泄漏错误时,我很担心,但是如果进程退出,那我还需要担心吗?
-
@FatalCatharsis 你不知道。操作系统释放进程在执行期间获取的所有资源。但是,您可能希望保留一些外部状态,例如在终止之前将一些缓冲区转储到文件中。
-
@ yuri Kilochek:那么我想这就是我的问题的答案,忽略它,它就会消失:P。非常感谢
标签: c++ visual-studio-express visual-studio-2010