std::shared_ptr<T>:~shared_ptr
From cppreference.com
< cpp | memory | shared ptr
| ~shared_ptr(); |
||
もし*this がオブジェクトを所有しており、それがそのオブジェクトを所有する最後のshared_ptrである場合、オブジェクトは所有されるデリータを通じて破棄されます。
破棄後、もしあれば*this と所有権を共有していたスマートポインタは、以前の値より1つ少ないuse_count() を報告します。
[編集] 注記
std::unique_ptrとは異なり、std::shared_ptrのデリータは、管理対象のポインタがnullであっても呼び出されます。
[編集] 例
このコードを実行
#include <iostream> #include <memory> struct S { S() { std::cout << "S::S()\n"; } ~S() { std::cout << "S::~S()\n"; } struct Deleter { void operator()(S* s) const { std::cout << "S::Deleter()\n"; delete s; } }; }; int main() { auto sp = std::shared_ptr<S>{new S, S::Deleter{}}; auto use_count = [&sp](char c) { std::cout << c << ") use_count(): " << sp.use_count() << '\n'; }; use_count('A'); { auto sp2 = sp; use_count('B'); { auto sp3 = sp; use_count('C'); } use_count('D'); } use_count('E'); // sp.reset(); // use_count('F'); // would print "F) use_count(): 0" }
出力
S::S() A) use_count(): 1 B) use_count(): 2 C) use_count(): 3 D) use_count(): 2 E) use_count(): 1 S::Deleter() S::~S()
[編集] 関連項目
weak_ptr を破棄する( std::weak_ptr<T> の public メンバ関数) |