#include<iostream>
class base{
public:
virtual void run(){};
protected:
~base(){std::cout<<"destructor for base"<<std::endl;};
};
class derived : public base {
public:
void run(){};
~derived(){std::cout<<"destructor for derived"<<std::endl;};
};
void get_type ( std::shared_ptr<base> b ){
b.reset ( new derived );
std::cout<<"end of get_type"<<std::endl;
}
int main(){
std::shared_ptr<base> b;
get_type ( b ) ;
std::cout<<"out of get_type"<<std::endl;
b->run();
}
它编译好了,但我得到了分段错误。我调查了发生了什么,输出是
get_type的结尾 析构函数派生 基础的析构函数 超出get_type 分段错误:11
进入get_type并分配其类型。但是,超出此功能范围,它会再次自动销毁该类型。然后,因为它找不到b-&gt; run(),所以它给出了seg错误。谁知道如何让它工作?我找不到类似的问题。对不起,如果可能重复。
答案 0 :(得分:3)
您的get_type()
函数会收到main
函数中定义的shared_ptr的副本。然后它为此副本分配一个值并返回。离开get_type
函数时,副本会正常释放其指针。然后在你的main
函数中,初始的shared_ptr仍然是未分配的,显然在尝试取消引用它以调用run
方法时会出现分段错误。
要使算法正常工作,您应该在get_type
函数中询问对非共享引用的shared_ptr。
PS:正如其他人所指出的,你必须使你的基类的析构函数变为虚拟。