3

アプリケーションで次の擬似コードのようなことをする必要があるかもしれないと思います:

boost::shared_ptr<T> p;
...
...
p = boost::shared_ptr<T>(new T);

boost::shared_ptr代入演算子を使用するための他のオプションがあることは認識していますが、ドキュメンテーション/例で、デフォルトのコンストラクターを含むこのようなケースについては決して議論されていないことに気付きました。

私の質問は、次のとおりです。これは有効な使用ですか?言い換えれば、それは合法であり、潜在的なメモリリークにつながる可能性がありますか? アイデア/修正を感謝します。どうもありがとう!

注: 以下のいくつかのコメントも示唆しているようにshared_ptr、コンストラクターを で呼び出すときは常に名前付きを使用することをお勧めしnewます。それでも、これが害を及ぼす可能性があるとは想像しがたいです。反例がある場合は、親切に投稿してください。ありがとう!

4

1 に答える 1

4

それは完全に合法であり、メモリセーフです。デフォルトのコンストラクターを呼び出しているという事実Tは関係ありません。動的に割り当てられたオブジェクトがある限り、それをshared_ptr<>

デフォルトのコンストラクターを参照する場合も問題ありません。ラップされたポインターは NULL であり、他のポインターが割り当てられshared_ptr<>ても削除されません。shared_ptr<>

ただし、内容が NULL かどうかを確認する必要があります。そうしないと、無効なポインターにアクセスしている可能性があります。

于 2012-06-21T21:01:53.177 に答える