1. ホーム
  2. c++

[解決済み] C++のstd::shared_ptrが空である場合とヌルである場合の違いは何ですか?

2023-06-15 15:36:33

質問

その cplusplus.com shared_ptr ページ の区別を呼び出します。 空の std::shared_ptr そして ヌル shared_ptr . は cppreference.com のページ はその区別を明示的に呼び出していませんが、 "empty"と比較の両方を使用しています。 nullptr の説明の中で std::shared_ptr の動作の説明で

空とNULLの違いはありますか? shared_ptr ? このような混合動作のポインタのユースケースはあるのでしょうか?空でないヌル shared_ptr は意味をなすのでしょうか?通常の使用において(つまり、明示的に構築しなかった場合)、空でありながら NULL でない shared_ptr ?

また、C++11版ではなくBoost版を使っている場合、これらの答えは何か変わるのでしょうか?

どのように解決するのですか?

の変なコーナーです。 shared_ptr の挙動に影響を与えます。これにはコンストラクタがあり、それを使って shared_ptr その を所有する を指し示す を指しています。

template< class Y > 
shared_ptr( const shared_ptr<Y>& r, T *ptr );

shared_ptr はこのコンストラクタを使って構築された 所有権の共有 r が、しかし を指しています。 何であれ ptr を指している(つまり get() または operator->() が返されます。 ptr ). これは ptr が所有するオブジェクトのサブオブジェクト(例えば、データメンバー)を指している場合、便利です。 r .

リンク先のページでは shared_ptr を呼び出していますが、これは何も所有していない 空の であり、かつ shared_ptr は何も指していない(つまり、その get() == nullptr ) ヌル . ( は、規格上この意味で使われています。 はそうではありません)。null-but-not-emptyを構成することができます。 shared_ptr を構成することはできますが、それはあまり便利ではありません。空の、しかし空でない shared_ptr は本質的に非所有ポインタであり、それを使って次のような奇妙なことをすることができます。 を期待する関数に、 スタック上に確保された何かへのポインタを渡すといった奇妙なことに使うことができます。 shared_ptr を期待する関数にポインタを渡すことです (ただし、私は shared_ptr をAPI内に置いた人を先に殴ることをお勧めします)。

boost::shared_ptr また にはこのコンストラクタがあります。 を呼び出します。 エイリアシングコンストラクタ .