名前空間
変種
操作

std::shared_ptr<T>:~shared_ptr

From cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
 
~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 メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)