如何使智能指针在exit()处超出范围

how to make smart pointer go out of scope at exit()

本文关键字:范围 exit 何使 智能 指针      更新时间:2023-10-16

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

所以,我想问你们的问题是,内存真的会在退出或断言时被释放吗?如果不是,我是否可以从std::shared_ptr派生并实现我自己的解决方案,对在调用退出或断言之前要释放的动态分配对象进行编目,或者对于更简单的解决方案来说,这太多的工作了吗?

当程序退出时,内存无论如何都会被操作系统回收,所以如果泄漏让你担心,那就不应该了。

但是,如果您的析构函数中有逻辑,并且必须销毁对象,则显式调用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;
   }
}

真正的问题不是内存,而是其他资源。操作系统将(在大多数情况下,除非您运行嵌入式系统)在进程终止时从进程中恢复内存,因此操作系统中的内存不会泄漏。实际的问题可能是您的流程外部的其他资源,这些资源可能需要在您的流程完成之前发布。。。

无论如何,为什么您更喜欢abortexit,而不是让异常传播?一般来说,你应该只处理你想要管理的异常,让其他的失败。虽然您可能无法从中恢复,但您的调用者实际上可能能够恢复。通过捕获异常并当场退出程序,您可以从用户那里删除处理选项。