0

std::enable_shared_from_this から派生したクラスがあります。すべてのクラス オブジェクトは共有ポインターによって管理されるため、それらを指す共有ポインターがなくなると自動的に破棄されます。

プログラムのデータ構造からいくつかの共有ポインタを削除するクラス メソッドがあり、「これ」、つまりクラス メソッドが呼び出されたオブジェクトへのすべての共有ポインタを削除するリスクがあります。

問題は、実際にすべてのポインターが削除された場合、メソッドの実行中にオブジェクトが破棄され、「this」ポインターが単に無効になる可能性があるかどうかです。それが起こらないようにしたい場合は、システムを信頼できますか、それともメソッド内で "this" に shared_ptr を作成して、処理が完了するまでオブジェクトを存続させる必要がありますか? (そして、ポインターがなくなったら、メソッドの実行が終了したら破棄しても問題ありません)

例:

class SharedObj : public std::enable_shared_from_this<SharedObj>
{
   /* ... */
    void do_something(SharedObj& a, SharedObj& b);
    std::shared_ptr<SharedObj> child;
};

void SharedObj::do_something(SharedObj& a, SharedObj &b)
{
   /* ... */
   a.remove_child();
   b.remove_child();
}

a と b だけが "this" を指す shared_ptr を持っている場合、2 つの remove_child() 行の後には "this" を指す共有ポインターがないため、基本的には自動的に破棄されるはずです。

4

2 に答える 2

3

確かに、実行していることを実行することで、メソッド内からインスタンスを破壊することになります。ただし、この状況はに固有のものenable_shared_from_thisではありません。メソッド内でいつでも何かを呼び出して、自分のクラスを破壊する可能性があります。これは、クラスが破棄された後に服従しようとした場合のエラーにすぎません。thisクラスインスタンスを変更したりアクセスしたりしない通常のコードを続行する場合は、安全です。

関数の実行全体にわたってインスタンスを永続化する必要がある場合は、(の実行shared_ptr中に独自のインスタンスを保持するために)提案したことをお勧めします。do_something

于 2013-02-09T08:48:22.610 に答える
2

Dave の回答の代替または追加として、ライフタイムを管理するために共有ポインターを使用している場合は、関数が戻るまでポインターがオブジェクトを存続させるように、共有ポインターを介してのみオブジェクトを呼び出す必要があります。共有ポインター管理オブジェクトへの非所有ポインターを格納する場合は、弱いポインターを格納し、それを使用する前にロックする必要があります。ロックによって作成された共有ポインタは、オブジェクトを再び存続させます。

于 2013-02-10T13:21:25.107 に答える