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」,它從不刪除這些對象。爲什麼信號不會刪除那些斷開的連接?這不是一個非常奇怪的行爲?保留這些連接而不是刪除它們的原因是什麼?以及如何強制它刪除這些連接?
我很抱歉,我這裏提供的例子是一個簡化版本。我在一個boost :: asion服務器中使用它。 sconped_connect無法工作。 – 2010-11-07 01:55:50