gpt4 book ai didi

c++ - 'new' 关键字和类存储

转载 作者:太空狗 更新时间:2023-10-29 23:52:59 26 4
gpt4 key购买 nike

与此问题并行: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 是分配的堆(自由存储)。但是 b 类中 A 的内容呢?假设 A 也分配了堆是否安全?

最佳答案

“在堆上”,迂腐地说,有点用词不当。 C++ 不规定堆的使用,只规定使用 new 分配的对象。分配在未指定的“免费商店”上。无论如何...

是的,如果B有一个类型为 A 的成员变量然后你实例化一个 B使用 new然后所有该对象都在免费商店中。

但是请务必注意,当您这样做时:

B* b = new B;

b 本身 不在自由存储中,而是一个自动变量(即“在堆栈上”)。 b 的东西指向 在免费商店中。自动变量在超出范围时会被销毁——但是 b指向在这种情况下不会。如果你不delete b; ,你会发生内存泄漏。

这可能令人困惑并且看起来不重要。也许这令人困惑,但这并非不重要。事实b是一个自动变量,指向自由存储上的某些东西,这使得称为 RAII 的非常重要的习惯用法成为可能,它用于智能指针之类的东西。

shared_ptr<B> b(new B);

b ,在这里,仍然是一个自动变量。但是当b超出范围并被销毁,它拿走了东西 b指向它。此处使用智能指针将有助于消除因未使用而造成的内存泄漏 delete b以上。

关于c++ - 'new' 关键字和类存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12983326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com