与此问题并行:When should I use the new keyword in C++?
假设我有以下代码结构:
class Foo{
private:
int a;
int b;
/* ect */
};
class Bar{
private:
Foo A;
/* ect */
};
int main() {
Bar *b;
b = new Bar();
// call b->methods()
delete b;
};
我知道上面的链接b
是分配的堆(免费商店)。但是课程A
内b
的内容呢?假设A
也分配了堆是否安全?
答案 0 :(得分:8)
“在堆上”,讽刺的是,有点用词不当。 C ++没有规定使用堆,只是使用new
分配的对象在未指定的“免费存储”上分配。总之...
是的,如果B
的成员变量类型为A
,并且您使用B
实例化new
,则所有该对象都在免费商店中。< / p>
重要的是要注意,当你这样做时:
B* b = new B;
b
本身不在免费商店中,而是一个自动变量(即“在堆栈上”)。 b
指向的在免费商店中。当自动变量超出范围时会被销毁 - 但在这种情况下,b
指向的东西不会被破坏。如果你没有delete b;
,你就会收到内存泄漏。
这可能令人困惑,似乎并不重要。也许这很令人困惑,但这并不重要。 b
是一个指向免费商店内容的自动变量这一事实使得一个非常重要的习惯用法被称为RAII,它被用于智能指针之类的东西。
shared_ptr<B> b(new B);
b
,这里仍然是一个自动变量。但是当b
超出范围并被销毁时,它需要b
点的内容。在这里使用智能指针将有助于消除上面没有delete b
时创建的内存泄漏。