首页 > 解决方案 > 当由另一个在堆上分配的对象创建时,对象在哪里分配?

问题描述

class Foo {
    int num;
};

class Bar {
public:
    Bar() {
       Foo f1;
    }
};

int main() {
    Bar* b = new Bar();
    return 0;
}

在上面的代码中,我在堆上创建了一个 Bar (b) 的实例。在 Bar 的构造函数中,创建了一个 Foo (f1) 的实例。由于 b 是在堆上创建的,而 f1 是临时的,我不确定 -当构造函数被调用时它存储在哪里?

对象内存入栈时会自动处理,那么如果f1存放在堆上,如何在Bar的构造函数完成后自动销毁呢?另一方面,如果它存储在堆栈上,那么堆上的对象 b 是如何指向它的呢?

标签: c++memory-managementdynamic-memory-allocation

解决方案


指向b的对象(即类型对象)的存储Bar分配在堆上

但是,f1不是该对象的一部分。相反,它是在调用函数时创建的本地对象Bar(该函数是 的构造函数,但这无关紧要)。并且本地对象都分配在调用栈上,无一例外。

(Nathan 的回答正确地指出 C++ 没有堆栈或堆存储的概念;上面的解释涉及 C++ 的实现,而不是语言定义。)


推荐阅读