1

我是一名爱好者 C++ 程序员,目前正在开发一款游戏(使用 Ogre3D),我对我的主类的内存分配有疑问。

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

以下是布局的简化片段:

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_;
};

在堆栈或堆上分配内存更好(应用程序类和工厂类)?通过什么论据?

提前致谢!

4

3 回答 3

4

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

于 2011-02-22T01:34:52.990 回答
0

在这种情况下,我认为这一切都归结为大小。

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

于 2011-02-22T01:31:15.310 回答
0

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

现在,为什么避免在堆上分配?这可能是因为堆大小有限,但对于现代机器来说,这几乎不是问题,即使在手持设备中也是如此。然而,堆栈空间可能很有限。所以这支持堆。

当然,auto内存不会“泄漏”——但分配在主(或文件范围内,尽管这是静态的)中的内存不会被释放,因此几乎可以声称它“自动”泄漏。

我认为这里的基本问题实际上是“你为什么不在堆上分配?” 主要原因通常是为了避免内存泄漏,但小心使用new/delete可以保护您免受这种情况的影响——并且鉴于库中动态分配的普遍性等,即使您设法避免动态分配,您也不能停止考虑良好的内存卫生分配。

于 2011-02-22T01:31:34.480 回答