Я обнаружил, что некоторые объекты в моей программе на C ++ не могут быть освобождены из-за того, что Signal2 boost не освобождает эти аргументы в объекте, созданном boost :: bind. Вот код для воспроизведения проблемы:
#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 удалит все соединения. Но на самом деле это не так. Я просто прочитал исходный код сигналов2, кажется, что signal.disconnect только устанавливает флаг «отключить» в тех соединениях, он никогда не удаляет эти объекты. Почему сигнал не удаляет эти отключенные соединения? Разве это не очень странное поведение? В чем причина сохранения этих соединений, а не их удаления? И как заставить его удалить эти соединения?