我创建了一个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并阻止执行。
这是一个很好的方法吗?
答案 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
。