我在删除对象时遇到段错误,被基类的指针引用,即使我已经声明了析构函数是虚拟的!
这是我的代码
class Shape
{
public:
virtual ~Shape()
{
cout<<"Shape destructor is called!"<<endl;
}
};
class Line : public Shape
{
public:
~Line()
{
cout<<"Line destructor is called!"<<endl;
}
};
int main()
{
Line myLine;
Shape* myShapePtr = &myLine; //Line A
delete myShapePtr;
}
`
输出
行析构函数被调用!
形状析构函数被调用!
./runCP.sh: line 2: 2915 Segmentation fault ./a.out
我知道在 A 行中,对象被切片,这就是我收到此错误的原因。但是,我仍然无法弄清楚对象切片如何导致段错误。
如果对象已经被切片,那么肯定没有调用虚析构函数,但是这里也调用了虚析构函数。
请帮助我理解这一点。
最佳答案
您只能删除
分配给new
的对象。
myShapePtr
不指向用new
分配的对象,它指向myLine
,这是一个局部变量。
作为局部变量,myLine
具有自动存储持续时间。当到达结束声明它的 block 的 }
时,它将被自动销毁。
关于c++ - 甚至使用虚拟析构函数删除的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6763316/