我最近一直在嘗試shared_ptr,並且我碰到了一些奇怪的情況。我想要的是一個模板成員函數,它能夠返回其派生類型的shared_ptr。我正在運行visual studio 2010,它可以訪問一些新的C++ 0x標準,但我認爲boost boost_ptr的行爲類似。shared_ptr從成員函數返回上演版本的問題
這與裸指針正常工作。我剛剛返回了一個dynamic_cast < DerivedClass * >(this)。然而,我有點難過,因爲即使使用enable_shared_from_this,對象也會在函數調用後嘗試刪除自身(這很糟糕)。我可能會接近這個錯誤,但我想研究如何模擬以下(這是我遇到的代碼)的裸指針等效(這是工作)。
//assume we have a virtual function as well.
class BaseClass : public std::enable_shared_from_this<BaseClass>
{
....
template<typename DerivedClass>
std::shared_ptr<DerivedClass> BaseClass::getThis(){
//I had some assert code here to ensure typeid matched
return std::dynamic_pointer_cast<DerivedClass>(shared_from_this());
}
}
編輯:看來功能正常工作,該問題是與我是如何使用它。它是壞的,例如執行以下操作:
std::shared_ptr<DerivedClass> p = std::make_shared<DerivedClass>();
p->getType<DerivedClass>->someOtherFunctionOnlyInTheDerivedClass();
這不是一個問題:
std::shared_ptr<BaseClass> p = std::make_shared<DerivedClass>();
p->getType<DerivedClass>->someOtherFunctionOnlyInTheDerivedClass();
我不能完全肯定,如果它與轉換爲同一類型的問題,或參考計數問題。在任何情況下,我都在做一些愚蠢的事情,並且破壞了,避免了不必要的getType調用,在那個時候,我似乎在使用它的其他任何情況下都能正常工作。也許有人可以準確解釋導致第一個例子與第二個例子一起工作的原因。我會爲該答案分配點數。
這可能與調用位置的代碼有關,顯示實際實例的創建方式,保存位置以及調用getThis()模板的位置。 – 2011-03-28 11:39:07
你是否在調用getThis後分配返回的值?????? – UmmaGumma 2011-03-28 11:44:50
我編輯了我的問題以反映啓示。我不再有問題,一切似乎都能正常工作,但我很好奇究竟是什麼打破了。 – M2tM 2011-03-28 12:04:01