#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();
}它编译正常,但我遇到了分段错误。我调查了一下发生了什么,结果是
base of get_type分段的派生析构函数的get_type析构函数结束: 11
它进入get_type并分配它的类型。但是,如果超出此函数作用域,它将再次自动析构该类型。然后,因为它找不到b->run(),所以它给出了seg错误。有人知道怎么让它工作吗?我找不到类似的问题。如果可能是重复的,很抱歉。
发布于 2014-11-05 03:50:11
get_type()函数接收main函数中定义的shared_ptr的copy。然后,它为这个副本赋值并返回。当离开get_type函数时,副本照常释放它的指针。然后,在您的main函数中,初始shared_ptr仍然是未分配的,显然,当您试图取消对它的引用以调用run方法时,您会得到一个分段错误。
为了让您的算法工作,您应该在get_type函数中请求对shared_ptr的非常数引用。
PS:正如其他人所指出的,必须使基类的析构函数为虚的。
https://stackoverflow.com/questions/26743265
复制相似问题