当对象被分配在堆上的另一个对象创建时分配到哪里?
Where Object Is Allocated When Created By Another Object That Was Allocated On Heap?
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如何指向呢?
b
指向的对象的存储——即类型Bar
的对象——分配在堆上。
但是,f1
不是该对象的一部分。相反,它是一个 本地对象 ,它是在调用函数时创建的(该函数是 Bar
的构造函数,但这无关紧要)。并且本地对象无一例外都分配在调用栈上。
(Nathan 的回答正确指出 C++ 没有堆栈或堆存储的概念;上面的解释涉及 C++ 的实现,而不是语言定义。)
C++ 没有栈和堆内存的概念space。相反,它具有自动存储持续时间和动态存储持续时间。当范围为 left/parent 对象被销毁时,具有自动存储持续时间的东西(你没有使用 new)被清理。动态存储对象只有在您手动释放为其获取的内存时才会被清理。
在这种情况下,由于你没有在b
上调用delete
来释放内存,那么b
指向的对象没有被销毁,所以你有内存泄漏。
有
Bar() {
Foo f1;
}
您在构造函数中创建一个对象,一旦构造函数主体退出,编译器将插入代码为您清理 f1
,因为它具有自动存储持续时间。
如果您创建一个具有动态存储持续时间的对象,并且该对象具有具有自动存储持续时间的子对象,那么它们仍然驻留在分配给主对象的同一内存中space。只要主对象被正确释放,那么它的析构函数将处理清理其中具有自动存储持续时间的子对象。
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如何指向呢?
b
指向的对象的存储——即类型Bar
的对象——分配在堆上。
但是,f1
不是该对象的一部分。相反,它是一个 本地对象 ,它是在调用函数时创建的(该函数是 Bar
的构造函数,但这无关紧要)。并且本地对象无一例外都分配在调用栈上。
(Nathan 的回答正确指出 C++ 没有堆栈或堆存储的概念;上面的解释涉及 C++ 的实现,而不是语言定义。)
C++ 没有栈和堆内存的概念space。相反,它具有自动存储持续时间和动态存储持续时间。当范围为 left/parent 对象被销毁时,具有自动存储持续时间的东西(你没有使用 new)被清理。动态存储对象只有在您手动释放为其获取的内存时才会被清理。
在这种情况下,由于你没有在b
上调用delete
来释放内存,那么b
指向的对象没有被销毁,所以你有内存泄漏。
有
Bar() {
Foo f1;
}
您在构造函数中创建一个对象,一旦构造函数主体退出,编译器将插入代码为您清理 f1
,因为它具有自动存储持续时间。
如果您创建一个具有动态存储持续时间的对象,并且该对象具有具有自动存储持续时间的子对象,那么它们仍然驻留在分配给主对象的同一内存中space。只要主对象被正确释放,那么它的析构函数将处理清理其中具有自动存储持续时间的子对象。