1

次のコードを想定します。

void SomeClass::SomeMethod()
{
    CComPtr<ISomeService> service = GetService();

    ExecuteInNewThread([&]()
    {
        service->AnotherMethod();
    });
}

関数Exec​​uteInNewThreadは、新しいスレッドで関数オブジェクトを実行するため、サービスポインターが解放された後にラムダ関数を実行できます。これを防ぐための最良の方法は何でしょうか?ラムダの最後でSomeMethodとRelease()でAddRef()を実行すると、見苦しくなります。

4

2 に答える 2

2

変数を値でキャプチャし、コピーコンストラクタとデストラクタに所有権のセマンティクスについて心配させるだけです。これがスマートポインタの目的です。既存のコードは間違いなく正しくありません。

于 2012-06-24T21:36:43.517 に答える
1

ローカル変数への参照を含むクロージャー オブジェクトが、その作成の最も内側のブロック スコープの後に呼び出された場合、動作は未定義です。

別のスレッドでクロージャ オブジェクトを実行することも未定義になると考えていたでしょう。

于 2012-06-24T21:08:41.253 に答える