我有以下内容:
类B
侦听类boost::signal2
的{{1}},触发后将执行类C
给出的回调,并执行类{{1}中的方法}
A
,A
和A
,B
都是C
。
问题是当类D
释放指向类std::shared_ptr
的指针时,由于信号处理程序,D
没有被删除。即使我在B
上呼叫断开连接,我也有同样的问题。
任何想法如何解决这个问题?
答案 0 :(得分:2)
所以问题是由shared_ptr
周期引起的。
班级A
传递给班级B
和std::function
,其中shared_ptr
为班级A
,因此班级A
永远不会删除。
例如。 B.route(std::bind(&A::myFunc, shared_from_this()));
我用类A
中的lambda函数和weak_ptr修复它:
std::weak_ptr<A> wp = shared_from_this();
A.route(std::bind([wp]() {
auto p = wp.lock();
if(wp)
wp->myFunc();
}));
这样我的函数myFunc
仅在A仍然有效的情况下被调用。