Lambda函数引用指针销毁检测

时间:2013-03-05 21:33:28

标签: c++ pointers lambda detection

我创建了一个lambda函数来在不同的线程中运行代码,或者只是稍后运行它,但是可能会发生lambda函数保留的对象同时被删除。

如何在那种情况下检测到并且不运行该功能?

例如

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;
}

或者也可以在执行lambda函数之前完成检测。

另一个想法是拥有一个对象&#34; Runnable&#34;保留lambda函数并将其注册到可以删除的函数。然后在析构函数中,我将通知Runnable并阻止执行。

这是一个很好的方法吗?

2 个答案:

答案 0 :(得分:2)

您无法测试指针指向的对象是否已被删除..

如果它已被删除,那么你的test()就会有不确定的行为。

答案 1 :(得分: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复制到lambda,a的生命周期将延长lambda的生命周期。

这确实要求在lambda之外使用a的代码符合shared_ptr