2010-12-20 8 views
16

私はenable_shared_from_this<Base>を使用していて、Baseから継承しています。 Derivedのコンストラクタ(イニシャライザリストではない)にshared_from_this()を使用しようとすると、例外が発生します。内部弱ポインタ​​がヌルで、thisをまったく指していないことがわかります。これはどうしたらできますか?私の他のユースケースはまったく問題なく動作します。私はどこから始めるべきか分からない。私はenable_shared_from_thisのソースコードを見て、それは常にnullptrになるポインタのように私に見えます。enable_shared_from_this - 空の内部弱ポインタ​​?

+1

本当に重複しない:http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –

答えて

34

オブジェクトのコンストラクタ内でshared_from_this()を呼び出すことはできません。 shared_from_this()は、オブジェクトが少なくとも1つのshared_ptrによって所有されていることが必要です。構成する前にオブジェクトをshared_ptrで所有することはできません。

shared_ptrがオブジェクトの所有権を初めて取得したときに内部ウィークポインタが設定されていると思います。その前に、ウィークポインタが参照できる参照カウント構造体はありません。

5

James McNellis's answerが正しい。 this pageの一番下に何もしないように見えるあなたが観察としてenable_shared_from_thisテンプレート自体の説明、については

、ノート7は説明する:

...テンプレート enable_shared_from_thisweak_ptrオブジェクトを保持しています派生オブジェクト を指しています。しかし、 鳥と卵の問題については、約 weak_ptrオブジェクト がない場合は対応する shared_ptrオブジェクトを初期化する方法があります。実装 トリックは shared_ptrのコンストラクタを約 enable_shared_from_thisを知っている、と 公共 基底クラスとして enable_shared_from_thisを持っている リソースを所有shared_ptrオブジェクトの構築時に weak_ptrオブジェクトを設定することです。

1

は概念的には、shared_from_this()thisshared_ptrポインティングをピックアップし、そのコピーを返します。

コンストラクタでは、thisを指すshared_ptrがありません。

関連する問題