Lambda函数引用指针破坏检测
Lambda function referenced pointer destroyed 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函数之前进行检测。
另一个想法是让一个对象"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
。
相关文章:
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- 未检测到的空指针
- 未检测到越界指针算法?
- ***检测到的GLIBC *** MS2:free():无效指针:0xB7526FF4 ***
- gcc-如何检测基于指针的内存访问
- glibc 检测到 *** free() 无效指针
- "空指针已通过",用于检测轮廓
- *** glibc检测到*** free():无效的指针:
- 为引用计数的智能指针检测内存泄漏的设计模式
- c++提升线程glibc检测到无效指针
- 检测到指针引用可能存在内存泄漏
- 检测"内存泄漏"时,瓦尔格林德的真实指针是什么?
- glibc 检测到 free() 无效指针
- 为什么此循环不检测空指针?
- 如何检测或避免使用未初始化C++指针
- 如何使用动态强制转换检测指针的删除
- 如何检测指针是否已删除并安全删除
- 方法检测指针是否指向…确切的地点