2017-08-01 65 views
0

我有以下:C++的shared_ptr的std ::绑定和std ::功能

B侦听C类的boost::signal2并且当触发将执行由A类已知回调并且在类执行的方法A

ABCD都是std::shared_ptr

问题是,当类D释放指向类B的指针时,由于信号处理程序,B未被删除。即使我呼吁在boost::connection断开连接,我也有同样的问题。

任何想法如何解决这个问题?

+2

你能告诉我们一些代码吗? – Frank

+0

是的,如果没有足够的代码让人们理解内部发生了什么,这不是没有用的。 –

+0

我想你想要的是['std :: weak_pointer'](http://en.cppreference.com/w/cpp/memory/weak_ptr)用于信号处理程序,但我同意使用代码会使这更容易了解。 –

回答

1

所以问题是由于shared_ptr周期。

A被传递到B类的std::function其保持shared_ptrA,所以类A从未被删除。

例如。 B.route(std::bind(&A::myFunc, shared_from_this()));

我lambda函数和A类的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仍然有效,才会调用。