2017-08-01 64 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仍然有效,纔會調用。