8

オブジェクトがまだ構築されていないため、クラスのコンストラクターからshared_from_this()を呼び出してshared_ptrを取得することはできないことを理解しています。ただし、コンストラクターからオブジェクトへのweak_ptrを取得することは可能ですか?「weak_from_raw()」メソッドについて議論しているいくつかのブーストフォーラムの投稿は、それが可能かもしれないことを示唆しています。

編集:weak_from_rawを議論するブーストフォームhttp://lists.boost.org/boost-users/2010/08/61541.php

4

2 に答える 2

16

あなたが参照しているのはこれだと思います。これはブーストリリースにマージされていないようです(それについては間違っている可能性があります)。

ブーストドキュメントから:

よくある質問

Q.オブジェクトは、コンストラクターでそれ自体にweak_ptrを作成できますか?

A.いいえ。weak_ptrはshared_ptrからのみ作成でき、オブジェクトの構築時には、オブジェクトへのshared_ptrはまだ存在しません。これに対して一時的なshared_ptrを作成できたとしても、コンストラクターの最後でスコープ外になり、すべてのweak_ptrインスタンスが即座に期限切れになります。

解決策は、コンストラクターをプライベートにし、shared_ptrを返すファクトリ関数を提供することです。

class X
{
private:

    X();

public:

    static shared_ptr<X> create()
    {
        shared_ptr<X> px(new X);
        // create weak pointers from px here
        return px;
    }
};
于 2011-01-04T22:16:56.373 に答える
5

参照: http: //boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#in_constructor

問題は、オブジェクトが構築されていないということではありません。問題は、shared_ptrが構築されていないことです。shared_ptrを作成し、それをどこかに送信するだけであれば、すべて問題ありません。これは、作成したばかりのオブジェクトを含むshared_ptrを作成しようとするときです。2つを接続する方法がないため、大きな問題が発生します。

shared_from_thisが機能する方法は、オブジェクトにアクセスするためにshared_from_thisを呼び出す前に、オブジェクトがshared_ptrであると想定することです。まだ行っていないため、オブジェクトのコンストラクターが終了しておらず、shared_ptrが接続されていないため、shared_from_thisを呼び出すことはできません。

weak_ptrでもまったく同じ問題が発生します。

したがって、言い換えると、このばかげた構成は機能します。

struct absurd
{
  absurd()
  {
    register(shared_ptr<absurd>(this));
  }
};

...
new absurd; // better not assign to a shared_ptr!!!

しかし、あなたは本当にこれをしたくありません。

于 2011-01-04T22:20:09.213 に答える