gpt4 book ai didi

即使使用智能指针,C++ 也会在异常情况下泄漏

转载 作者:可可西里 更新时间:2023-11-01 16:28:51 24 4
gpt4 key购买 nike

我是智能指针世界的新手。我读完了,他们都说智能指针将避免内存泄漏,即使程序在遇到异常后退出也是如此。

我写了一个简单的程序来尝试这个,但是 Valgrind告诉我我的程序正在泄漏内存(三个分配,只有一个空闲)。

这是源代码:

#include <iostream>
#include <memory>

using namespace std;

int main()
{
auto_ptr<int> ptr_int(new int(5));

throw std::bad_alloc();

cout << *ptr_int;
}

还有这个 Valgrind 报告:

==27862== Memcheck, a memory error detector
==27862== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==27862== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==27862== Command: ./smart_pointers
==27862== Parent PID: 5388
==27862==
==27862==
==27862== HEAP SUMMARY:
==27862== in use at exit: 104 bytes in 2 blocks
==27862== total heap usage: 3 allocs, 1 frees, 120 bytes allocated
==27862==
==27862== 4 bytes in 1 blocks are still reachable in loss record 1 of 2
==27862== at 0x4026351: operator new(unsigned int) (vg_replace_malloc.c:255)
==27862== by 0x804878A: main (smart_pointers.cpp:8)
==27862==
==27862== 100 bytes in 1 blocks are possibly lost in loss record 2 of 2
==27862== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==27862== by 0x40E861A: __cxa_allocate_exception (in /usr/lib/libstdc++.so.6.0.14)
==27862== by 0x80487AE: main (smart_pointers.cpp:10)
==27862==
==27862== LEAK SUMMARY:
==27862== definitely lost: 0 bytes in 0 blocks
==27862== indirectly lost: 0 bytes in 0 blocks
==27862== possibly lost: 100 bytes in 1 blocks
==27862== still reachable: 4 bytes in 1 blocks
==27862== suppressed: 0 bytes in 0 blocks
==27862==
==27862== For counts of detected and suppressed errors, rerun with: -v
==27862== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 19 from 8)

使用智能指针是否保证即使出现异常也会销毁分配的资源?

最佳答案

如果未处理异常,则在调用 std::terminate 之前是否展开堆栈由实现定义。

如果您处理异常,那么智能指针将按预期工作。

引用:

C++11 15.5.1 std::terminate() 函数

1 In some situations exception handling must be abandoned for less subtle error handling techniques. These situations are:

........

— when the exception handling mechanism cannot find a handler for a thrown exception , or

........

2 In such cases std::terminate() is called. In the situation where no matching handler is found, it is implementation-defined whether or not the stack is unwound before std::terminate() is called.

关于即使使用智能指针,C++ 也会在异常情况下泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com