デフォルトで構築された(空の)shared_ptrは自動的にnullptrに初期化されますか?質問する

デフォルトで構築された(空の)shared_ptrは自動的にnullptrに初期化されますか?質問する

shared_ptrデフォルトで構築された (空)は自動的に に初期化されると、あるブログで読みました。nullptrしかし、標準ではそのような明示的な記述を見つけることができませんでした。

これを確認するために、小さなスニペット (Linux コンパイル) を作成しました。

#include <iostream>
#include <memory>

struct Base;

int main()
{
    std::shared_ptr<Base> p;
    Base* b;

    if (p == nullptr) {
        std::cout << "p IS NULL \n";
    }
    else {
        std::cout << "p NOT NULL \n";
    }

    if (b == nullptr) {
        std::cout << "b IS NULL \n";
    }
    else {
        std::cout << "b NOT NULL \n";
    }

    return 0;
}

出力:

p IS NULL 

b NOT NULL

このことから、スマート ポインターはnullptr宣言時に暗黙的に割り当てられていることがわかります。この動作を確認できる人はいますか?shared_ptr手動で a を割り当てずにa を使用するのは安全ですかnullptr?

ベストアンサー1

はい、cppreferenceデフォルト コンストラクターは、nullptrコンストラクターに a を渡すだけと同じであることがわかります。

constexpr shared_ptr() noexcept;                        (1)
constexpr shared_ptr( std::nullptr_t ) noexcept;        (2)

1-2) 管理対象オブジェクトを持たないshared_ptrを構築する、つまり空のshared_ptrを構築する

また、2017 年の C++ 標準ドラフト:

23.11.2.2.1shared_ptrコンストラクタ

...

constexpr shared_ptr() noexcept;
  2効果:空の   オブジェクトを構築しますshared_ptr。3
事後条件: use_count() == 0 && get() == nullptr

おすすめ記事