Lambda函数引用指针破坏检测

Lambda function referenced pointer destroyed detection

本文关键字:检测 指针 函数 引用 Lambda      更新时间:2023-10-16

我创建了一个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函数之前进行检测。

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

这是个好办法吗?

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

如果它已经被删除,那么您的test((将只具有未定义的行为。

这里有一个解决方案:

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的使用是可选的——如果将其作为复制到lambda的shared_ptr,则a的生存期将延长lambda的生存期。

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