【问题标题】:Deleting an object off the stack?从堆栈中删除一个对象?
【发布时间】:2013-03-05 11:11:03
【问题描述】:

只是想知道,因为我正在与一个 C++ 项目的合作伙伴一起工作, 是否可以显式删除已在堆栈上初始化的对象? (所以没有指针)

例如:

MinHeap h(data); // on stack

对比

MinHeap *h = new MinHeap();

这从来没有出现过,因为我总是在堆上为一个大对象分配内存。

【问题讨论】:

  • 显而易见的问题是,当堆栈自动为您清理时,为什么要“显式删除”堆栈上的某些内容?
  • 好吧,我实际上不会,但我更精通 Java 的伙伴想要避免指针并初始化堆栈上的对象。然后当我们需要明确删除它时出现了这个问题,所以我只是想知道答案,因为我从未想过这个问题
  • 好吧,告诉他这是一件好事,不会造成任何问题。您无需删除任何内容。实际上,如果您不需要显式控制对象的生命周期,则在堆栈上是首选的执行方式。

标签: c++ object stack


【解决方案1】:

堆栈变量在其当前范围内始终有效。您可以通过在您希望实例在其中有效的块周围使用大括号来强制范围(从而释放分配的内存):

{
  MinHeap h(data);
  // Do stuff here

} // h gets freed here

【讨论】:

    【解决方案2】:

    简短而唯一的答案是否定的。

    如果一个对象是在堆栈上分配的,实际上分配它的不是你,而是编译器为你分配的。当函数范围结束时,编译器也有责任“取消分配”(或“删除”)对象。

    使用delete 的唯一原因是释放您使用new 分配的内容。

    【讨论】:

      【解决方案3】:

      是否可以显式删除已在堆栈上初始化的对象?

      ,这是不可能的。

      根据 C++11 标准的第 5.3.5/2 段关于delete 表达式:

      如果操作数具有类类型,则通过调用上述方法将操作数转换为指针类型 转换函数,并且转换后的操作数用于代替原始操作数的其余部分 这个部分。 在第一种选择(删除对象)中,delete的操作数的值可能是空指针 value,指向由先前的 new 表达式创建的非数组对象的指针,或指向子对象的指针 (1.8) 表示这种对象的基类(第 10 条)。如果不是,则行为未定义。 [...]

      第 3.7.3/3 段也有关具有自动存储持续时间的变量(即“在堆栈上”分配):

      如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,不应 在其块结束之前被销毁,也不应该作为优化被淘汰,即使它看起来 未被使用,除非类对象或其复制/移动可以按照 12.8 中的规定被消除。

      【讨论】:

        猜你喜欢
        • 2012-12-09
        • 2013-08-03
        • 1970-01-01
        • 2012-12-05
        • 2021-11-10
        • 2019-06-24
        • 2014-11-30
        • 2013-08-11
        • 2020-02-19
        相关资源
        最近更新 更多