分段错误甚至使用虚拟析构函数删除

Sno*_*yMe 0 c++

我正在删除一个反对的分段错误,被基类的指针引用,即使我已经声明析构函数是虚拟的!

这是我的代码

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;
}
Run Code Online (Sandbox Code Playgroud)

`

产量

行析构函数被调用!

形状析构函数被称为!

./runCP.sh:line 2:2915分段错误./a.out

我理解在A行中,对象被切片,这就是原因,我收到了这个错误.但是,我无法弄清楚对象切片如何导致分段错误.

如果对象已被切片,则不得调用虚析构函数,但此处也会调用虚析构函数.

请帮我理解这个.

Jam*_*lis 13

您只能delete分配一个对象new.

myShapePtr不指向分配的对象new,它指向的myLine是一个局部变量.

作为局部变量,myLine具有自动存储持续时间.当它到达声明它的块时,它将被自动销毁}.


sha*_*oth 5

您只能使用delete创建的对象new,使用delete其他任何内容,包含的局部变量,是未定义的行为.