对C++多态性用法的疑问
Quesition on C++ polymorphism usage
#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->run((,它给出了 seg 错误。有人知道如何让它工作吗?我找不到类似的问题。抱歉,如果可能重复。
get_type()
函数接收main
函数中定义的shared_ptr的副本。然后,它为此副本分配一个值并返回。离开 get_type
函数时,副本会像正常情况一样解除分配其指针。然后在您的 main
函数中,初始shared_ptr仍然未赋值,显然您在尝试取消引用它以调用 run
方法时会出现隔离错误。
为了使您的算法正常工作,您应该在 get_type
函数中询问对shared_ptr的非常量引用。
PS:正如其他人指出的那样,您必须使基类的析构函数成为虚拟的。
相关文章:
- 这个指针在c++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- equal_to模板类C++用法
- PCL 中的 GICP 用法
- 向量的正确用法<int>::size_type
- C++命名空间的基本用法