删除主类的对象指针是否也删除了嵌套类指针?

时间:2013-02-26 12:46:47

标签: c++ class subclass

我在类中有一个类,嵌套类

class A {
 public:
 int a;
 int b;
  class B {
    int c;
    int d;
  }
}

在这个过程中,我在堆中分配了B类的对象指针。

   B *bobj = new B();
   A *a;
   auto_ptr<A> A1(new A());
   a = A1.release();

删除a,删除bobj吗?

delete a;

还是应该显式删除子类指针?

这是在我不写的代码中,我把日志放在所有的alloc和deallocs上,我看到B *bobj = new B(),为此没有删除,对于A的对象ptr,有一个删除。然而,没有内存泄漏。这就是为什么我怀疑在这种情况下会发生什么。

4 个答案:

答案 0 :(得分:9)

我觉得你在这里有些困惑。如果您有A类型的对象,则其中没有B对象。它只有两个intab。您的类B刚刚被声明为A中的嵌套类 - 类似于在命名空间中声明它。它必须在课堂外被称为A::B(并且必须public才能这样做)。

在您提供的示例代码B *bobj = new B(); A *a;中,您甚至没有创建A对象。我认为你的意思是这个(假设你做B public):

A::B *bobj = new A::B();
A *a = new A();

abobj都是完全独立的对象。他们彼此无关。你必须delete他们两个。

如果你做了这个:

class B {
  int c;
  int d;
};

class A {
  int a;
  B b;
};

现在类类型A的对象有一个名为b的成员,其类型为Bb成员是A类型的任何对象的一部分。因此,如果您执行A* a = new A();,则会得到一个A对象,其中包含B个对象。您只能delete a;

黄金法则delete您所拥有的内容new

答案 1 :(得分:3)

您编写代码的方式,class Bclass A中的嵌套类型,但class B中不包含class A的实例,这意味着实例化 - - 因此破坏 - 必须单独管理。所以是的,如果你delete两者都需要new

答案 2 :(得分:3)

这取决于你的析构函数在做什么。如果A包含类型B的指针,并且在A的析构函数中,此指针被释放 - 是的。如果A不包含B类型的指针和/或A的析构函数指针B未释放 - 您应该手动释放它。

答案 3 :(得分:2)

简而言之,C ++不会自动删除对象指针(没有专门的自动指针等)。因此,在您的计划中明确删除

delete a;调用A类的析构函数。您可以编写代码来删除析构函数中的B对象。