名前空間
変種
操作

std::get_deleter

提供: cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
 
動的メモリ管理
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
C のライブラリ
低水準のメモリ管理
 
 
template< class Deleter, class T >
Deleter* get_deleter( const std::shared_ptr<T>& p ) noexcept;
(C++11およびそれ以降)

p のデリータにアクセスします。 p が cv 修飾されない Deleter 型のデリータを所有する (つまり、デリータを引数として取るコンストラクタのどれかを使用して作成された) 場合、そのデリータを指すポインタを返します。 そうでなければ、ヌルポインタを返します。

目次

[編集] 引数

p - アクセスしたいデリータを持つ shared_ptr

[編集] 戻り値

所有するデリータを指すポインタまたは nullptr。 返されたポインタは、それを所有する shared_ptr のインスタンスが少なくとも1つ残っている限り、有効です。

[編集] ノート

返されたポインタは最後の shared_ptr より長生きするかもしれません。 例えば、 std::weak_ptr が残っていて、制御ブロック全体が破棄されるまでデリータを破棄しない実装になっている場合などです。

[編集]

shared_ptr のデリータが shared_ptr の型と独立していることをデモンストレーションします。

#include <iostream>
#include <memory>
 
struct Foo { int i; };
void foo_deleter(Foo * p)
{
    std::cout << "foo_deleter called!\n";
    delete p;
}
 
int main()
{
    std::shared_ptr<int> aptr;
 
    {
        // create a shared_ptr that owns a Foo and a deleter
        auto foo_p = new Foo;
        std::shared_ptr<Foo> r(foo_p, foo_deleter);
        aptr = std::shared_ptr<int>(r, &r->i); // aliasing ctor
        // aptr is now pointing to an int, but managing the whole Foo
    } // r gets destroyed (deleter not called)
 
    // obtain pointer to the deleter:
    if(auto del_p = std::get_deleter<void(*)(Foo*)>(aptr))
    {
        std::cout << "shared_ptr<int> owns a deleter\n";
        if(*del_p == foo_deleter)
            std::cout << "...and it equals &foo_deleter\n";
    } else
        std::cout << "The deleter of shared_ptr<int> is null!\n";
} // deleter called here

出力:

shared_ptr<int> owns a deleter
...and it equals &foo_deleter
foo_deleter called!

[編集] 関連項目

std::shared_ptr のコンストラクタ
(パブリックメンバ関数)