2

与这个问题并行:我什么时候应该在 C++ 中使用 new 关键字?

假设我有以下代码结构:

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也分配了堆是否安全?

4

1 回答 1

8

“在堆上”,学究式地,有点用词不当。C++ 没有规定使用堆,只是分配使用new的对象分配在未指定的“自由存储”上。反正...

是的,如果B有一个类型的成员变量A并且您实例化一个Busingnew那么所有该对象都在免费存储中。

但是,重要的是要注意,当您这样做时:

B* b = new B;

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

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

shared_ptr<B> b(new B);

b,在这里,仍然是一个自动变量。但是当b超出范围并被销毁时,它会b使用它指向的东西。在这里使用智能指针将有助于消除您没有在delete b上面创建的内存泄漏。

于 2012-10-19T22:35:20.827 回答