我有一個非常簡單的類來處理回調。來電者要求經理進行回叫。只要Callback對象被調用者持有,它仍然有效。然而,一旦對象死亡,它的析構函數會將管理器中的指針設置爲NULL,以便在下次遇到它時知道它將被丟棄。將返回一個對象調用它的析構函數嗎?
...或者至少,這是我追求的基本想法。
class Manager{
public:
void executeOnList() { ... }
Callback requestCallback(Drawable * target){
Drawable ** ptr = list.add(target);
return Callback(ptr); // <-- the point of interest
}
private:
List list;
};
class Callback{
friend Manager;
private:
Callback(Drawable ** targetPtr){
drawablePtr = targetPtr;
}
public:
~Callback(){
(*drawablePtr) = NULL; // <-- dtor of interest
}
private:
Drawable ** drawablePtr;
};
我的問題是,是否會Manager::requestCallback()
呼叫Callback
返回結構,它的調用者之前的析構函數?
如果是這樣的話,是否有任何方法可以防止這種情況發生,同時(或多或少)維持Callback
功能背後的基本思想?
這取決於您是否獲得[返回值優化](http://en.wikipedia.org/wiki/Return_value_optimization)。在你的例子中,我希望你會。 – juanchopanza
@juanchopanza - 我已經閱讀過這篇文章,雖然看起來有點冒險,但沒有明確要求... –
對此你沒有辦法做到這一點(當然,有些編譯器可以關閉它,但看起來像悲觀化)。您不應該依賴RVO *而不是*發生。 – juanchopanza