1. ホーム
  2. c++

C++11 shared_ptr をクリアする場合、reset と set to nullptr のどちらを使用すべきですか?

2023-08-31 01:23:26

質問

C++11のベストプラクティスについて質問があります。 shared_ptrをクリアする場合、"clear "コマンドを使用する必要があります。 reset() 関数をパラメータなしで使用するべきか、それとも shared_ptrnullptr ? 例えば

std::shared_ptr<std::string> foo(new std::string("foo"));
foo.reset();
foo = nullptr;

どちらのアプローチにもメリット・デメリットがあるのでしょうか?

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

<ブロッククオート

どちらを選んでも同じですか?

2つの選択肢は完全に等価であり、2番目の形式( foo = nullptr ) が最初の形式の観点から定義されているという意味で、2 つの選択肢は絶対に等価です。C++11 標準の 20.7.1.2.3/8-10 パラグラフによる。

 unique_ptr& operator=(nullptr_t) noexcept;

8 効果 : reset() .

9 ポストコンディション : get() == nullptr

10 戻る : *this .

したがって を選択すればよいのです。 . 個人的には

foo = nullptr;

なぜなら、ポインタをヌルにしたいことがより明白になるからです。しかし、一般的なアドバイスとして、以下のような状況を最小限にするようにしてください。 明示的に スマートポインタをリセットする必要がある状況を最小限にするようにしてください。


その上、むしろ new :

std::shared_ptr<std::string> foo(new std::string("foo"));

を使うことを考える。 std::make_shared() を使うようにしましょう。

auto foo = std::make_shared<std::string>("foo");