【问题标题】:calling destructor using delete使用 delete 调用析构函数
【发布时间】:2014-11-22 16:56:16
【问题描述】:

这样做是否正确:

MyClass mc1(1, 1);
MyClass* pmc1 = &mc1;
delete pmc1;

我在一个代码示例中看到了它。我以为我们可以在指向堆上分配的对象的指针上调用 delete,但是这个指针指向堆栈上的一个对象,不是吗? 谁能解释一下。

【问题讨论】:

    标签: c++ destructor delete-operator


    【解决方案1】:

    没有。您永远不应该在指向尚未使用new 创建的对象的指针上调用delete。这是未定义的行为。

    C++ 标准 n3337 § 5.3.5/2 删除

    (...)delete的操作数的值可以是空指针值,a 指向由先前的 new 表达式创建的非数组对象的指针,或 一个指向子对象 (1.8) 的指针,表示此类的基类 对象(第 10 条)。如果不是,则行为未定义。

    【讨论】:

    • 那么我认为是正确的,而代码 sn-p 做错了什么?但是,如果我在指向堆栈上的对象的指针上调用 delete 会发生什么?
    • abort() 将被 malloc 调用并由程序发出错误代码 6 will be received
    • @0d0a,这是未定义的行为。绝对不能保证会发生这种情况。
    • @chris 当然这是正确的 - SIGABRT 在这里只是巧合,谢谢您的警告
    猜你喜欢
    • 2013-06-25
    • 2017-02-15
    • 2018-06-02
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2014-01-28
    • 2011-02-05
    相关资源
    最近更新 更多