3

这是一个过度简化,但我无法重现这个问题。

#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我在这里忽略的“向上转换”是否存在一些问题,或者我的段错误是否来自其他地方。

4

1 回答 1

0

要做的一件事是在基类中定义虚拟析构函数,这样当 shared_ptr 超出范围时将调用正确的 dtor

OTOH:似乎是 VS2010 中的错误,gcc 4.8 可以编译和链接

以下代码无法与 VS2010 链接并出现错误:

1>Derived.obj : 错误 LNK2005: "public: __thiscall Derived::Derived(void)" (??0Derived@@QAE@XZ) 已在 cpp.obj 中定义 1>Derived.obj: 错误 LNK2005: "public: virtual __thiscall Derived::~Derived(void)" (??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;
}
于 2012-11-08T02:17:43.700 回答