1

別のスレッドでコードを実行するため、または少し後でコードを実行するためにラムダ関数を作成しましたが、ラムダ関数によって保持されているオブジェクトがその間に削除される可能性があります。

どうすればそれを検出し、その場合に関数を実行しないことができますか?

例えば

class A
{
public:
    A(){}
    virtual void test(){std::cout << m;}
    int m;
};
int main()
{
    A* a = new A();
    std::function<void ()> function = [=]()->void
    {
        //if( pointer to 'a' still valid )
        {
            a->test();
        }
    };
    delete a;
    //or if( pointer to 'a' still valid )
    function();

    system("pause");
    return 0;
}

または、ラムダ関数を実行する前に検出を行うこともできます。

もう1つのアイデアは、オブジェクト「Runnable」にラムダ関数を保持させ、削除可能なオブジェクトに登録することです。次に、デストラクタでRunnableに通知し、実行を阻止します。

それはそれを行うための良い方法でしょうか?

4

2 に答える 2

2

ポインターが指すオブジェクトが削除されたかどうかをテストすることはできません。

削除されている場合、 test() は未定義の動作をするだけです。

于 2013-03-05T21:46:00.497 に答える
0

解決策は次のとおりです。

std::shared_ptr<A> a(new A());
std::weak_ptr<A> weak_a(a);
std::function<void ()> function = [weak_a]()->void
{
    if( std::shared_ptr<A> a = weak_a.lock() )
    {
        // to get the A* from a, do a.get()
        // operator-> and *a work however:
        a->test();
    }
};
a.reset(); // instead of delete

の使用weak_ptrはオプションです。代わりにshared_ptrラムダにコピーした場合、の有効期間はaラムダの有効期間によって延長されます。

aこれには、ラムダの外部を使用するコードがshared_ptr準拠している必要があります。

于 2013-03-06T15:00:32.067 に答える