我是一名业余爱好者C ++程序员,目前正在开发游戏(使用Ogre3D),我对主要类的内存分配有疑问。
我已经阅读了很多内存分配,在堆栈上自动分配并在堆上动态分配,以及它们的差异(性能,有限的堆栈大小)。我仍然不确定我的主类(Application)和其他一些'工厂'类(由Application类的单个实例创建)使用什么,在整个执行过程中都会有一个实例存在。
以下是布局的简化摘录:
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类和工厂类)是否更好?通过什么论证?
提前致谢!
答案 0 :(得分:4)
始终更喜欢动态分配的自动分配。当您需要动态分配时,请确保其生命周期由自动分配的资源包装器管理,如智能指针。
答案 1 :(得分:0)
在这种情况下,我认为这一切都取决于规模。
您不想浪费堆栈空间,因此要么使用new
进行动态分配,要么将Application
作为main()
之外的全局变量。
答案 2 :(得分:0)
在C ++中,问题相当复杂,但总的来说,你无法避免在堆上进行分配。例如,您的new
操作是在堆上分配Application
对象 - new
在运行时动态分配内存,auto
内存的分配是在编译时确定。 (当然,它实际上是在运行时分配 - 但它是在启动代码根据编译的分配为main
创建堆栈时分配的。)
现在,为什么希望避免在堆上分配?这可能是因为堆大小有限,但现代机器很少出现问题,即使在手持设备中也是如此。但是,堆栈空间可能会受到限制。因此争论堆。
当然,auto
内存不会“泄漏” - 但是在主(或文件范围内,虽然那是静态的)中分配的内存不会被释放,因此人们几乎可以“自动地”声明它“泄露了。
我认为这里的基本问题是“为什么不会你在堆上分配?”主要原因通常是为了避免内存泄漏,但使用new/delete
的注意事项可以保护您免受这种情况的影响 - 并且考虑到图书馆中的动态分配无处不在,即使有了良好的内存卫生,也无法停止思考你设法避免动态分配。