enable_shared_from_this は同じ最適化を提供しますか? そう:
いいえ。標準の文言からわかるようにenable_shared_from_this<T>
、weak_ptr<T>
データ メンバーがあります。weak_ptr<T>
これにより、参照カウントを含む制御ブロックへのポインターを持つクラスにa が追加されます。参照カウントは直接含まれていません。参照カウントを含む制御ブロックは、オブジェクトの外部にまだ存在します。
参照カウントを含む制御ブロックは、オブジェクトweak_ptr
を参照していた他のオブジェクトが引き続き制御ブロックにアクセスして期限切れかどうかを確認できるように、オブジェクトよりも長く存続する必要があります。
制御ブロックがオブジェクト内にある場合、オブジェクトが破棄されたときに破棄され、weak_ptr
オブジェクトが期限切れかどうかをダングリングが安全に判断することはできません。理論的には、制御ブロックのメモリは割り当てられたままで使用され、参照カウントは更新されますが、それらが含まれていたオブジェクトが破棄されたとしても、それはかなり醜いようです (そして、オブジェクトが , で破棄されないことを意味しますdelete
)。メモリを解放するには、明示的なデストラクタ呼び出しと明示的な呼び出しが必要にoperator delete
なります)。
shared_ptr
また、所有がカスタム デリーターまたはカスタム アロケーターで作成された場合、これらのオブジェクトのサイズが事前にわからないため、埋め込み制御ブロックを使用できませんでした。このような場合、基本クラスに埋め込まれたものに加えてenable_shared_from_this<T>
外部制御ブロックを割り当てる必要があり、さらに多くのスペースを浪費します。