是否需要删除析构函数中的指针?

时间:2016-02-01 00:39:22

标签: c++ pointers memory memory-management

如果我这样做:

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

我必须在析构函数中执行:

delete pointer01;
delete pointer02;
是不是?我找不到任何相关内容。

3 个答案:

答案 0 :(得分:3)

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

然而,仅使用自动对象肯定会更容易和更好:

class A {
    B b;
    C c;
};

答案 1 :(得分:2)

是的,你有 - 基本上每个新的都需要相应的删除。但是你可以使用智能指针(这里是std :: unique_ptr)来简化生活。

答案 2 :(得分:1)

我认为其他答案过分关注应该做什么和良好做法,同时完全跳过真正的答案。

答案是否定的。您无需这样做。我认为标准中没有任何地方可以说明每个delete都需要new(如果不是这样,那么引用它会很好,这也是一个真正的答案。)

然而,当然资源获取应该与发布配对。这不是很糟糕。 永远一个好主意,但不会使程序非法。

我同意vsoftco的评论,这样的程序在语义上是不正确的,但我仍然认为它会产生合法的c ++代码。 (我不明白标准,我找不到导致内存泄漏或不与new配对的地方是非法的。)