2012-11-08 2 views
2

이것은 너무 단순화되어 있지만 문제를 다시 만들 수 없습니다.stcast :: shared_ptr Upcasting segfault가 발생합니다

#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; 
} 

정적 검사로 오류가 발견되지 않고이 프로그램이 정상적으로 실행됩니다. 그러나 더 복잡한 프로그램에서 나는 nondebuggable segfault를 얻습니다. 나는

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

에 대한

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

을 변경하려고하고 문제가 사라집니다.

여기에 "업 캐스팅"과 관련된 문제가 있다면 여기를 무시하거나 내 segfault가 다른 곳에서 왔는지 묻고 싶습니다. 그런 식으로 올바른 DTORS가있는 shared_ptr이

OTOH 범위를 벗어나 때 호출 될 사용자의 기본 클래스에 가상 소멸자를 정의하는 것입니다 할 수있는 일의

+2

Upcasting * 할 수 없습니다 * 여기, 이후 문제가 될 당신은 "변경된"코드에서 정확히 그것을합니다 - 이전의 장소에서. – Xeo

+1

가상 함수를 비우려고 했습니까? 기본 클래스의 가상 함수가 아닌 가상 함수를 호출 해 보았습니까? –

+0

유형 계층 구조의 어딘가에서 여러 상속이 가능합니까? – bitmask

답변

0

하나 : 은 VS2010에서 벌레처럼, GCC 4.8 컴파일을 보인다

1> Derived.obj : 오류 LNK2005 : 좋아 & 링크

다음 코드는 오류 VS2010와 연결하는 데 실패 (? 0Derived @@ QAE @ : "공공 파생 : 파생 (무효) __thiscall" XZ)가 이미 cpp.obj에 정의되어 있습니다. 1> Derived.obj : 오류 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 이 범위를 벗어나 더 복잡해 지지만 다른 shared_ptr 이 Derived *를 가리키는 경우 어떤 소멸자가 호출됩니까? 인스턴스 멤버가있는 경우 메모리 손상을 초래합니다. – Sarang

관련 문제