我在类中有一个类,嵌套类
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,有一个删除。然而,没有内存泄漏。这就是为什么我怀疑在这种情况下会发生什么。
答案 0 :(得分:9)
我觉得你在这里有些困惑。如果您有A
类型的对象,则其中没有B
对象。它只有两个int
,a
和b
。您的类B
刚刚被声明为A
中的嵌套类 - 类似于在命名空间中声明它。它必须在课堂外被称为A::B
(并且必须public
才能这样做)。
在您提供的示例代码B *bobj = new B(); A *a;
中,您甚至没有创建A
对象。我认为你的意思是这个(假设你做B
public
):
A::B *bobj = new A::B();
A *a = new A();
a
和bobj
都是完全独立的对象。他们彼此无关。你必须delete
他们两个。
如果你做了这个:
class B {
int c;
int d;
};
class A {
int a;
B b;
};
现在类类型A
的对象有一个名为b
的成员,其类型为B
。 b
成员是A
类型的任何对象的一部分。因此,如果您执行A* a = new A();
,则会得到一个A
对象,其中包含B
个对象。您只能delete a;
。
黄金法则仅delete
您所拥有的内容new
。
答案 1 :(得分:3)
您编写代码的方式,class B
是class A
中的嵌套类型,但class B
中不包含class A
的实例,这意味着实例化 - - 因此破坏 - 必须单独管理。所以是的,如果你delete
两者都需要new
。
答案 2 :(得分:3)
这取决于你的析构函数在做什么。如果A
包含类型B
的指针,并且在A
的析构函数中,此指针被释放 - 是的。如果A
不包含B
类型的指针和/或A
的析构函数指针B
未释放 - 您应该手动释放它。
答案 3 :(得分:2)
简而言之,C ++不会自动删除对象指针(没有专门的自动指针等)。因此,在您的计划中明确删除。
delete a;
调用A类的析构函数。您可以编写代码来删除析构函数中的B对象。