c++ - 甚至使用虚拟析构函数删除的段错误

标签 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;
}

`

输出

行析构函数被调用!

形状析构函数被调用!

./runCP.sh: line 2: 2915 Segmentation fault ./a.out

我知道在 A 行中,对象被切片,这就是我收到此错误的原因。但是,我仍然无法弄清楚对象切片如何导致段错误。

如果对象已经被切片,那么肯定没有调用虚析构函数,但是这里也调用了虚析构函数。

请帮助我理解这一点。

最佳答案

您只能删除分配给new的对象。

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

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

关于c++ - 甚至使用虚拟析构函数删除的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6763316/

相关文章:

c++ - GCC 的 TSAN 报告与线程安全静态本地的数据竞争

c++ - 从迭代器构造的反向迭代器是其先前的迭代器吗?

c++ - 使用对临时对象的引用的表达式模板可以重复使用吗?

c++ - 为什么在初始化期间应用用户定义的转换?

c++ - 格式化foreach宏的格式与使用clang-format的循环相同

c# - 0xC0020001 : The string binding is invalid. - 仅发生在 WPF 中

c++ - 使用 std::unary_function 时的 Lint 警告

c++ - Windows 上的 Cmake 不添加共享库路径(适用于 linux)

c++ - Qt简单记事本,QmainWindow状态栏打印行号

c++ - 将节点添加到链表的末尾 - C++