2012-11-08 59 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