【问题标题】:C++ - program crashes when defining custom destructor [closed]C ++ - 定义自定义析构函数时程序崩溃[关闭]
【发布时间】:2018-07-01 09:43:04
【问题描述】:

我有这样的课:

class Foo{
public:
    Foo* next = nullptr;

    Foo() = default;

    Foo(Foo *next){
        Foo::next = new Foo(*next);
    }

    Foo(const Foo &copy){
        next = new Foo(*copy.next);
    }


    ~Foo(){
        delete next;
    }
}

它可以编译,但是当我在任何地方实例化该类时,程序崩溃了。使用调试器时,会在delete next 处触发“断点陷阱”。

这是为什么呢?

编辑:

问题是,在某些情况下,next 可以设置为在类之外创建的指针。我以为你可以删除在任何地方创建的指针。

【问题讨论】:

  • “为什么?”因为你违反了 3/5/0 的规则
  • 其他的东西是什么?
  • 你的程序不应该尝试删除之前没有用 new 初始化的东西。
  • 请向我们展示更多上下文..

标签: c++ destructor


【解决方案1】:

您的指针next 未初始化,指向某事未知。 delete 将(很可能,如果你幸运的话)试图删除它。确保指针指向使用new 分配的内存或者是nullptr

【讨论】:

  • 您应该比回答一个迫使您做出如此多假设的问题更好,因为它与 MCVE 没有任何相似之处。
  • @bolov 他发布的代码包含一个明显的错误......我有点惊讶你认为我应该是通灵者并且看到这个错误会变成“不是错误”。我没有假设......代码有一个错误,就像这里写的那样,我指出了它。
  • 谢谢我有几个实例,我接受了在类之外创建的指针。我现在已经解决了这个问题。谢谢你:)
  • @nvoigt 当我看到带有[other stuff] 的初始架构代码时,很明显(至少对我而言)他只是展示了声明和析构函数,而忽略了代码的重要部分。 [other stuff] 告诉我他并不打算将其作为 MCVE,并且他的真实代码对 next 进行了某种初始化/赋值
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2020-11-10
  • 2014-12-15
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多