【发布时间】:2021-01-09 03:50:15
【问题描述】:
我正在查看一些开源应用程序,发现main.cpp 文件看起来像这样
...
int main()
{
Application *app = new Application;
delete app;
return 0;
}
基本上,代表实际应用程序的整个逻辑的应用程序对象是在堆上分配的,但问题是在一些其他文件中,这些文件是应用程序的一部分,例如 Window.h 或 event.h 等等,正在进行一些堆分配,例如 event.h 使用新指针将事件存储在队列中...
我的问题是:如果整个应用程序都在堆上运行,那么堆分配的意义何在,有什么区别吗?
为什么很多应用程序和大多数游戏都会这样做(在堆上分配主要的“入口对象”)?
谢谢!
【问题讨论】:
-
分解:1)“实际应用程序的整个逻辑都分配在堆上......”所以如果有任何事情要做,那么它是从“应用程序的”构造函数开始的。好的。所以呢? 2)“在属于应用程序的一些其他文件中,例如 Window.h 或 event.h ...”通常,标头是专门的编译时工件。 3)“如果整个应用程序都在堆上运行,那么堆分配的意义是什么”这是完全非squiter :(
-
那么为什么选择“堆”和“栈”呢?通常,选择动态堆分配来控制对象的生命周期。例如,在函数内部创建一个对象,但在外部,在其他函数中使用它。另一个用例可能是资源有限:从堆中分配,以免堆栈最大化。 “性能”可能是另一个问题。这是一个很好的总结:geeksforgeeks.org/stack-vs-heap-memory-allocation
-
仅仅因为
Application是动态创建的,并不否定它可能需要动态创建其他东西,而不是静态创建。事件队列就是其中的一个示例,因为直到运行时才会收到事件,Application可能希望将它们排队等待延迟处理。使用类包装器创建 UI 元素是另一个示例,因为 UI 必须在运行时动态创建,而不是在编译时静态创建。无论是否动态创建主Application,有很多原因需要动态内存 -
@Ronaldjoe 只有
Application类的成员才会存储在Application对象本身的内存中,无论是在堆上还是在堆栈上创建。在类之外定义的其他事情将单独处理。Application为自己动态创建的东西以在运行时完成其工作。以std::vector为例。在运行时向vector添加元素不会更改std::vector类本身,这些元素不会存储在vector对象本身的内存中。数据存储在向量管理的内存中的其他位置。 -
我不会尝试描述 cmets 中对象内存布局的复杂性。几乎任何decent C++ book 都应该涵盖这一点。
标签: c++ heap-memory dynamic-memory-allocation