如何使智能指针在exit()处超出范围
how to make smart pointer go out of scope at exit()
我花了一些时间编写了一个应用程序进行练习,我喜欢全程使用智能指针,以避免在忘记删除某些内容时内存泄漏。同时,我也喜欢使用异常来报告构造函数中的失败并尝试处理它。然而,当它不能处理时,我希望它通过调用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;
}
}
真正的问题不是内存,而是其他资源。操作系统将(在大多数情况下,除非您运行嵌入式系统)在进程终止时从进程中恢复内存,因此操作系统中的内存不会泄漏。实际的问题可能是您的流程外部的其他资源,这些资源可能需要在您的流程完成之前发布。。。
无论如何,为什么您更喜欢abort
或exit
,而不是让异常传播?一般来说,你应该只处理你想要管理的异常,让其他的失败。虽然您可能无法从中恢复,但您的调用者实际上可能能够恢复。通过捕获异常并当场退出程序,您可以从用户那里删除处理选项。
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何访问超出其块范围的对象?
- 如何使智能指针在exit()处超出范围