如何使智能指针超出范围退出()

Fat*_*sis 1 c++ visual-studio-2010 visual-studio-express

我花了一些时间编写一个练习应用程序,我喜欢使用智能指针,以避免内存泄漏,以防我忘记删除的东西.与此同时,我也喜欢使用异常来报告构造函数中的失败并尝试处理它.但是当它不能时,我希望它通过调用assert()或exit()来退出该位置的程序.但是,在msvc中使用crtdbg库时,它会报告智能指针的内存泄漏,这些指针会动态分配给它们.这对我来说意味着两件事之一.1)智能指针永远不会超出它们分配的范围,并且永远不会释放,导致一些内存泄漏,或者2)crtdbg没有捕获解除分配,因为它不会在main处退出.但是,从这个页面,使用_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 在程序开始时将从任何退出点捕获泄漏,我仍然使用它来获取内存泄漏错误.

所以我向你们提出的问题是,内存实际上会在退出或断言时被释放,如果没有,我是否可以从std :: shared_ptr派生并实现我自己的解决方案来编目动态分配的对象,以便在调用之前解除分配退出或断言,还是为更简单的解决方案做太多工作?

Luc*_*ore 6

当程序退出时,操作系统会回收内存,因此如果泄漏令您担心,则不应该.

但是,如果你的析构函数中有逻辑,并且必须销毁对象 - exit显式调用会绕过所有释放.解决此问题的方法是抛出一个异常,您可以调用exit,将其捕获main并返回.

#include "stdlib.h"

void foo()
{
   //exit(0);
   throw killException();
}

int main
{
   try
   {
      foo();
   }
   catch (killException& ex)
   {
      //exit program calling destructors
      return EXIT_FAILURE;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • @FatalCatharsis:无论内存是否实际泄露,你执行此操作的方式都有**错误:) (3认同)