c++ - 当由另一个在堆上分配的对象创建时,对象在哪里分配?
问题描述
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++ 的实现,而不是语言定义。)
推荐阅读
- android - 突出显示 arrayAdapter ListView 中的搜索文本
- javascript - 为什么在部署到 Heroku 的 Vue.js/Prisma 应用程序上出现丢失文件/文件夹错误?
- python - 无法在 Pyqt5 的 Qtext 编辑中使用 jinja2 设置表格的 CSS(文本换行和水平滚动条)
- apache-spark - Spark XML Parser 未以正确的格式写入输出
- laravel - 如何在 Laravel 中获取带有空格的请求?
- ios - GCD:使用 dispatch_apply 的最短作业终止
- ios - Paytm IOS Swift 与最新的 SDK 无效校验和
- delphi - 绘图到 FireMonkey TControl.Canvas 输出到 TForm Canvas
- postgresql - Quicksight 自定义查询 postgresql 函数
- crystal-lang - 长度为零的静态数组