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

行うべきことの 1 つは、基本クラスで仮想デストラクタを定義することです。これにより、shared_ptr がスコープ外になったときに正しい dtors が呼び出されます。

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 に答える