22

std::make_shared<T>(明示的に a を割り当てるのではなく)を呼び出すshared_ptr<T>と、パフォーマンス上の理由から、参照カウントが T のインスタンスと共にメモリに割り当てられることが期待されます。すべて順調です。

しかしweak_ptr、同じオブジェクトを参照するインスタンスがある場合、オブジェクトがまだ存在するかどうかを知るために、おそらくその参照カウントにアクセスする必要があります。

そのため、T のインスタンスへの最後の shared_ptr が破棄されると、システムを単純に理解すると、T が格納されているメモリの割り当てを解除できないことが暗示されます。

別の弱い参照カウンターがあり、理論的には T のインスタンスとは別に保持できるため、弱い参照がまだ存在している間に T を破棄し、メモリの割り当てを解除できます。しかし、その後、2 つの別々の割り当てに戻り、 の利点が妨げられますmake_shared

ここで何かを誤解していると思います。std::make_shared弱い参照が存在する場合、構築されたインスタンスに割り当てられたメモリを解放するにはどうすればよいですか?

4

2 に答える 2

13

を使用make_sharedし、実装でオブジェクトと参照カウントの両方に単一の割り当てを使用する場合、その割り当ては、すべての参照 (強い参照と弱い参照の両方) が解放されるまで解放できません。

ただし、すべての強い参照が解放された後、オブジェクトは破棄されます (まだ弱い参照があるかどうかに関係なく)。

于 2012-11-23T21:20:11.047 に答える
3

一般的な実装は、のref制御ブロックにstd::shared_ptr強い参照カウントと弱い参照カウントの両方を別々に含めることです。管理対象オブジェクトは、強参照カウントがゼロになると破棄されますが、参照制御ブロック自体は、弱参照カウントもゼロに達したときにのみ解放されます。

(を使用するstd::make_sharedと、ref制御ブロック自体に管理対象オブジェクトを保持するのに十分なメモリが含まれます。これは単なる詳細です。)

つまり、管理対象オブジェクトの監視可能な動作は、弱ポインタ​​ーとは無関係です。

于 2012-11-23T21:53:46.503 に答える