スマートポインタの世界は初めてです。私は読んだことがあり、スマートポインタは例外が発生した後にプログラムが終了してもメモリがリークするのを避けると述べています。スマートポインタを使用しても例外でC++のリークが発生する
私はこれを試してみるための簡単なプログラムを書きましたが、Valgrindは私のプログラムがメモリを漏らしていると教えています(3つのallocsと1つだけfree)。
#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)
スマートポインタは、割り当てられたリソースは、例外が現れた場合でも破壊されることを保証使用していますか?
それは '()'そのデフォルトの動作(中止 '呼び出すことですが)'終了呼び出して終了だから、まったく例外をキャッチしていません。あなたが例外をキャッチするとどうなりますか? –
最新のOSを使用している場合、OSは終了時にプログラムが使用していたメモリを再利用します。そのため、メモリ自体が漏れてしまう心配はありません。もちろん、明示的に自分自身をクリーンアップする必要のあるリソースを使用している場合は、別の状況です。 – TheJuice