2012-11-08 58 views
2

這是一個過分簡單化,但我不能重新創建問題。向上std :: shared_ptr導致段錯誤

#include <memory> 

class Base 
{ 
}; 
class Derived : public Base 
{ 
}; 

void doSomethingPolymorphical(std::shared_ptr<Base> basePointer) 
{ 
} 

int main(int argc, char** argv) 
{ 
    std::shared_ptr<Derived> sharedObject = std::make_shared<Derived>(); 
    doSomethingPolymorphical(sharedObject); 
    return 0; 
} 

靜態檢查發現沒有錯誤,此程序執行正常。但在一個更復雜的程序中,我得到了不可分割的段錯誤。我試圖改變

std::shared_ptr<Derived> sharedObject = std::make_shared<Derived>(); 

std::shared_ptr<Base> sharedObject = std::make_shared<Derived>(); 

和問題消失。

我想問一下,如果在上傳「shared_ptr」時存在一些問題,或者我的segfaults來自其他地方。

+2

上溯造型*不能*是這裏的問題,因爲你也可以在「更改」的代碼中做到這一點 - 只是在更早的地方。 – Xeo

+1

您是否嘗試清空虛擬功能?你有沒有試過從基類中的非虛函數調用虛函數? –

+0

是否有可能在類型層次結構中有多個繼承? – bitmask

回答

0

一個要做的事情是在你的基類來定義虛析構函數,這樣正確dtors會當shared_ptr離開

OTOH的範圍被稱爲: 好像在VS2010的bug,GCC 4.8編譯&鏈接好嗎

下面的代碼失敗,錯誤與VS2010鏈接:

1> Derived.obj:錯誤LNK2005: 「市民:__thiscall衍生::派生(無效)」(?? 0Derived @@ QAE @ XZ)已經在cpp.obj中定義了 1> Derived.obj:error LNK20 05: 「市民:虛擬__thiscall衍生::〜衍生(無效)」(?? 1Derived @@ UAE @ XZ)在cpp.obj已經定義

#include <memory> 
#include <iostream> 

class Base 
{ 
public: 

    Base() 
    {} 

    virtual ~Base() 
    {} 

    virtual void Print() const 
    { 
     std::cout << "from Base::Print" << std::endl; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    Derived() : Base() 
    {} 

    ~Derived() 
    {} 

    void Print() const 
    { 
     std::cout << "from Derived::Print" << std::endl; 
    } 
}; 

void doSomethingPolymorphical(std::shared_ptr<Base> basePointer) 
{ 
    basePointer->Print(); 
} 

int main(int argc, char** argv) 
{ 
    std::shared_ptr<Derived> sharedObject = std::make_shared<Derived>(); 
    doSomethingPolymorphical(sharedObject); 
    return 0; 
} 
+1

爲什麼不使用'''std :: shared_ptr sharedObject = std :: make_shared ();'''' – gvd

+0

在這種情況下您可以使用它。 但是,如果你讓實例shared_ptr 超出範圍,但你有另一個指向Derived *的shared_ptr ,那麼會調用哪個析構函數?如果你有實例成員,那麼它會導致內存損壞 – Sarang