2010-10-30 32 views
2

我發現在我的C一些對象++程序不能因釋放助推的SIGNAL2通過的boost ::綁定創建的對象不會釋放這些參數。下面是重現該問題的代碼:如何釋放綁定參數的引用boost :: signals2 :: signal保留嗎?

#include <iostream> 
#include <string> 

#include <boost/bind.hpp> 
#include <boost/signals2.hpp> 
#include <boost/shared_ptr.hpp> 

using namespace std; 
using namespace boost; 

class Foo { 
public: 
    Foo() { 
     cout << "Foo is created." << endl; 
    } 
    ~Foo() { 
     cout << "Foo is deleted." << endl; 
    } 
}; 

typedef shared_ptr<Foo> FooPtr; 
typedef signals2::signal<void()> Signal; 

void bar1(FooPtr pFoo) { 

} 

void bar2(Signal &s) { 
    FooPtr pFoo(new Foo()); 
    s.connect(bind(bar1, pFoo)); 
} 

int main() { 
    Signal signal; 
    bar2(signal); 
    cout << "A" << endl; 
    signal.disconnect_all_slots(); 
    cout << "B" << endl; 
    return 0; 
} 

和輸出看起來像這樣

Foo is created. 
A 
B 
Foo is deleted. 

我以爲signal.disconnect_all_slots將刪除所有連接。但實際上並沒有。我剛剛讀取了signal2的源代碼,似乎signal.disconnect在這些連接中只設置了一個標誌「disconnect」,它從不刪除這些對象。爲什麼信號不會刪除那些斷開的連接?這不是一個非常奇怪的行爲?保留這些連接而不是刪除它們的原因是什麼?以及如何強制它刪除這些連接?

回答

0

根據信息here確保連接釋放似乎是特別的 - 這是signals,但問題仍然在signals2

在你的情況,下面的修改後的版本你想要做什麼,我想:

#include <boost/bind.hpp> 
#include <boost/signals2.hpp> 
#include <boost/scoped_ptr.hpp> 

using namespace std; 
using namespace boost; 

class Foo { 
public: 
    Foo() { 
     cout << "Foo is created." << endl; 
    } 

    void bar() 
    { 
    } 

    ~Foo() { 
     cout << "Foo is deleted." << endl; 
    } 
}; 

typedef signals2::signal<void()> Signal; 

int main() { 
    Signal signal; 
    { 
     scoped_ptr<Foo> foo(new Foo); 
     signals2::scoped_connection c = 
      signal.connect(boost::bind(&Foo::bar, foo.get())); 

     cout << "C " << signal.num_slots() << endl; 
     signal.disconnect_all_slots(); 

     cout << "D " << signal.num_slots() << endl; 
    } 
    cout << "E " << signal.num_slots() << endl; 
    return 0; 
} 

輸出:

Foo is created. 
C 1 
D 0 
Foo is deleted. 
E 0 
+0

我很抱歉,我這裏提供的例子是一個簡化版本。我在一個boost :: asion服務器中使用它。 sconped_connect無法工作。 – 2010-11-07 01:55:50