首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于C++多态性用法的调查

关于C++多态性用法的调查
EN

Stack Overflow用户
提问于 2014-11-05 03:21:10
回答 1查看 63关注 0票数 2
代码语言:javascript
复制
#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错误。有人知道怎么让它工作吗?我找不到类似的问题。如果可能是重复的,很抱歉。

EN

Stack Overflow用户

发布于 2014-11-05 03:50:11

get_type()函数接收main函数中定义的shared_ptr的copy。然后,它为这个副本赋值并返回。当离开get_type函数时,副本照常释放它的指针。然后,在您的main函数中,初始shared_ptr仍然是未分配的,显然,当您试图取消对它的引用以调用run方法时,您会得到一个分段错误。

为了让您的算法工作,您应该在get_type函数中请求对shared_ptr的非常数引用。

PS:正如其他人所指出的,必须使基类的析构函数为虚的。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26743265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档