【问题标题】:how do nested heap allocation work in c++?嵌套堆分配如何在 C++ 中工作?
【发布时间】: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


【解决方案1】:

不是堆分配的问题,在这种情况下 main() 只是真正的应用程序启动的地方。如果你开发一个图形应用程序,它有几个类,你需要比 main() 更复杂的东西。最常用的方法是开发一个能够处理 UI、线程、初始化其他类、处理内存等的类......通常程序员将该类称为“应用程序”。

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2014-12-26
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多