我是一个业余的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类和工厂类都分配)更好?用什么论据呢?
提前感谢!
发布于 2011-02-22 09:34:53
总是更喜欢自动分配而不是动态分配。当您需要动态分配时,请确保它的生命周期由自动分配的资源包装器管理,如智能指针。
发布于 2011-02-22 09:31:15
在这种情况下,我认为这一切都取决于大小。
您不想浪费堆栈空间,因此要么对new使用动态分配,要么将Application作为全局变量放在main()之外。
发布于 2011-02-22 09:31:34
在C++中,这个问题要复杂得多,但一般来说,您无法避免在堆上进行分配。例如,new操作在堆上分配Application对象-- new在运行时动态分配内存,其中auto内存的分配是在编译时确定的。(当然,它实际上是在运行时分配的--但它是在启动代码根据编译后的分配为main创建堆栈时分配的。)
那么,为什么要避免在堆上进行分配呢?这可能是因为堆大小有限,但对于现代机器,即使是手持设备,这也很少是问题。然而,堆栈空间很可能是有限的。所以这就需要堆了。
当然,auto内存不会“泄漏”--但是在main (或文件作用域中,尽管是静态的)中分配的内存不会被释放,所以几乎可以说它是“自动”泄漏的。
我认为这里的关键问题是“为什么不在堆上分配?”主要原因通常是为了避免内存泄漏,但是谨慎使用new/delete可以保护您免受内存泄漏的影响--并且考虑到库中的动态分配之类的东西无处不在,即使您设法避免动态分配,您也无法停止考虑良好的内存卫生。
https://stackoverflow.com/questions/5073122
复制相似问题