考慮一下:的boost :: signals2 - 與插槽的對象descruction
#include <boost/signals2.hpp>
#include <iostream>
struct object_with_slot
{
void operator()()
{
std::cout << "Slot called!" << std::endl;
member = 50500;
}
int member;
};
int main()
{
boost::signals2::signal<void()> sig;
object_with_slot * ptr = new object_with_slot;
sig.connect(*ptr);
delete ptr;
sig();
}
輸出是 「叫老虎!」並沒有崩潰或任何東西。這就是爲什麼我有幾個問題:
1)爲什麼沒有崩潰?
2)爲什麼沒有崩潰,即使slot函數將某些東西分配給不存在的對象?
3)我怎樣才能讓信號自動追蹤其插槽的壽命?我的意思是當插槽被破壞時,它會斷開連接。
問題3是最重要的,因爲我需要實現觀察者模式,並且觀察者(插槽)的生命週期不會是靜態的(對於應用程序運行的整個時間)。
請使用信號的值語義。不要將引用推入其中,然後刪除這些引用的來源。沒有理由在這裏分配這個信號對象。 – 2013-02-14 20:17:59
@Nicol Bolas你能解釋一下嗎? – user1873947 2013-02-14 20:35:49
只要做'sig.connect(object_with_slot())'。那麼就沒有生命的問題。有一個原因是爲什麼'sig.connect'需要一個*引用*,而不是一個指針。 – 2013-02-14 20:37:03