21

a の制御ブロックはshared_ptr、少なくとも 1 つ存在する間は維持されますweak_ptr。共有ポインタが作成された場合、make_sharedそれはオブジェクトのメモリ全体が割り当てられたままであることを意味します。(オブジェクト自体は適切に破棄されますが、オブジェクトの制御ブロックとメモリが 1 つのチャンクに割り当てられているためmake_shared、それらは一緒にしか割り当て解除できません。)

私の理解は正しいですか?

この動作は、有名な「キャッシュの例」などの問題を表しているようです。オブジェクトのメモリは永久に割り当てられたままになります。

実際の状況で問題になりますか?shared_ptrこのような状況 (大きなオブジェクトと s を使用する意図) でコンストラクターを使用して作成する必要がありますかweak_ptr?

4

2 に答える 2

15

私の理解は正しいですか?

はい。weak_ptrs が (大きな) オブジェクトよりも大幅に長生きし、メモリが不足している場合は、 を避けることが有益な場合がありますmake_shared

ただし、ここでの「大きい」は によって測定されsizeof、多くの概念的に「大きい」オブジェクト (たとえば、 を除くほとんどの標準コンテナstd::array) は、そのメトリックでは非常に小さいです。オブジェクトが破壊されるので。

于 2015-08-20T09:23:48.873 に答える
2

私はVS2013でこれを試しましたが、あなたは完全に正しいです。デストラクタは、最後の shared_ptr が破棄されるときに呼び出されるため、オブジェクトに関連付けられている他のオブジェクトまたはメモリはすべて破棄されますが、shared_ptr が make_shared で作成された場合、メモリは最後の weak_ptr が破棄されるまで破棄されません。

make_shared がなくてもまだメモリを使用しているため、lock() が失敗した場合は、weak_ptrs をクリーンアップまたはリセットするのが常に良いと思います。

于 2015-08-20T09:38:54.930 に答える