首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态分配还是自动推荐创建子系统?

动态分配还是自动推荐创建子系统?
EN

Stack Overflow用户
提问于 2011-02-22 09:22:50
回答 3查看 676关注 0票数 1

我是一个业余的C++程序员,目前正在开发一个游戏(使用Ogre3D),我有一个关于我主要类的内存分配的问题。

我读了很多关于内存分配,在堆栈上自动分配和在堆上动态分配,以及它们的差异(性能,有限的堆栈大小)。我仍然不确定我的主类( Application )和其他一些“工厂”类(由Application类的单个实例创建)使用什么,它们在整个执行过程中都有一个实例。

下面是布局的简化代码片段:

代码语言:javascript
复制
int main() 
{
    // like this (automatic)
    Application app;
    app.create();    // initializing
    app.run();       // runs the game-loop

    // or like this (dynamic)
    Application* app;
    app = new Application();
    app->create();
    app->run();

    return(0);       // only reached after exiting game
}



class Application
{
public:
    Application();   // ctor
    ~Application();  // dtor

    // like this, using 'new' in ctor and 'delete' in dtor (dynamic)
    SceneManager* sceneManager_;   // a factory for handling scene objects
    DebugManager* debugManager_;   // a factory for handling debugging objects

    // or like this (automatic)
    SceneManager sceneManager_;
    DebugManager debugManager_;
};

在堆栈上分配内存还是在堆上分配内存(为Application类和工厂类都分配)更好?用什么论据呢?

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-22 09:34:53

总是更喜欢自动分配而不是动态分配。当您需要动态分配时,请确保它的生命周期由自动分配的资源包装器管理,如智能指针。

票数 4
EN

Stack Overflow用户

发布于 2011-02-22 09:31:15

在这种情况下,我认为这一切都取决于大小。

您不想浪费堆栈空间,因此要么对new使用动态分配,要么将Application作为全局变量放在main()之外。

票数 0
EN

Stack Overflow用户

发布于 2011-02-22 09:31:34

在C++中,这个问题要复杂得多,但一般来说,您无法避免在堆上进行分配。例如,new操作在堆上分配Application对象-- new在运行时动态分配内存,其中auto内存的分配是在编译时确定的。(当然,它实际上是在运行时分配的--但它是在启动代码根据编译后的分配为main创建堆栈时分配的。)

那么,为什么要避免在堆上进行分配呢?这可能是因为堆大小有限,但对于现代机器,即使是手持设备,这也很少是问题。然而,堆栈空间很可能是有限的。所以这就需要堆了。

当然,auto内存不会“泄漏”--但是在main (或文件作用域中,尽管是静态的)中分配的内存不会被释放,所以几乎可以说它是“自动”泄漏的。

我认为这里的关键问题是“为什么不在堆上分配?”主要原因通常是为了避免内存泄漏,但是谨慎使用new/delete可以保护您免受内存泄漏的影响--并且考虑到库中的动态分配之类的东西无处不在,即使您设法避免动态分配,您也无法停止考虑良好的内存卫生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5073122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档