【问题标题】:Is deleting pointers in the destructor required?是否需要在析构函数中删除指针?
【发布时间】:2016-02-01 00:39:22
【问题描述】:

如果我这样做:

class A {
    B* pointer01 = new B();
    C* pointer02 = new C();
}

我必须在析构函数中做什么:

delete pointer01;
delete pointer02;

还是没有?我在这方面找不到任何东西。

【问题讨论】:

  • 它们必须在某个时候被删除。它是在析构函数上还是其他地方取决于你想要A 的目的。
  • @juanchopanza 从技术上讲,它们不必是...取决于您是否喜欢内存泄漏
  • @M.M 不,它不仅限于内存泄漏。这取决于相关的析构函数是否有副作用。

标签: c++ pointers memory memory-management


【解决方案1】:

如果你真的要使用指针和动态分配的对象,那么是的,你绝对应该在你的析构函数中 delete 它们(除非你正在做一些奇怪的事情真的而且你的类不是这些对象的所有者。如果是这种情况,请停止它)。您还很可能需要适当的复制和赋值语义,请参阅The Rule of Three

但是,使用自动对象肯定会更容易更好:

class A {
    B b;
    C c;
};

【讨论】:

  • 更简单更好?也许。取决于班级做什么。它甚至可能可能,更不用说“更简单更好”了。
  • @LightnessRacesinOrbit 我觉得我的“肯定会更容易更好” 是合适的。我的意思是,提出这个问题的人不太可能实现std::unique_ptr,但即使他是,我的第一段也适用。
  • 只需要一个需要依赖前向声明的简单案例。尽管我承认必须将 OP 代码中的 NSDMI 视为严格的伪代码才能应用。
【解决方案2】:

是的,你有 - 基本上每个新的都需要相应的删除。但您可以使用智能指针(此处为 std::unique_ptr)让生活更轻松。

【讨论】:

    【解决方案3】:

    我认为其他答案过于关注一个人应该做什么和良好做法,而完全跳过了真正的答案。

    答案是否定的。您不需要这样做。我认为标准中没有任何地方说,每个new 都必须有一个delete(最好能引用一句,如果那不是真的,那也是一个真正的答案。)

    但是,资源获取当然应该与发布相结合。不这样做是非常糟糕的。这从来没有是个好主意,但不会使程序非法。

    我同意 vsoftco 的评论,即这样的程序在语义上是不正确的,但我仍然认为它会生成合法的 c++ 代码。 (我不知道标准,也找不到说明导致内存泄漏或不将newdelete 配对是非法的。)

    【讨论】:

    • 我有点不同意你的观点,虽然我明白你的意思。强制删除析构函数中的指针在语法上并非不正确,但在语义上是不正确的(即使您可以通过非特殊成员函数删除内存)。如果你不这样做,想想当你抛出异常时会发生什么,后者会被捕获。你最终会泄漏内存。
    • 如果分配给new的所有地方都没有在退出点被deleted释放,那么程序会导致UB吗?如果是这样,我的答案是错误的,如果不是,那是对的。我的观点是,从标准的角度来看,泄漏是可以的。也许不是,我希望看到一个适当的矛盾。我知道这可能会出现争议,但从技术上讲它是正确的,除非标准真的说它不是。我知道这是不好的做法,但违反做法并不会使代码非法。
    • 它可以导致UB,取决于AB的析构函数。此外,drigs 类比也不是很好。在许多情况下,你不能吸毒,但这是个好主意。
    • 不,答案本身并没有错,顺便说一句,我没有投反对票。这就是为什么我说我不同意有点
    • @juanchopanza 删除了引用,我只是想强调一下。在更多的情况下,药物可能不是一个糟糕的选择,而不是没有正确释放你的记忆。顺便说一句,您能否详细说明或展示真实示例,其中不释放分配的内存会导致 UB 或使程序非法。即使以反对票为代价,我也坚持我的观点。
    猜你喜欢
    • 2014-12-30
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2013-10-01
    • 2020-12-27
    • 2021-04-04
    • 2019-12-13
    相关资源
    最近更新 更多