我正在使用C ++开发基于小组件的游戏引擎。各种组件被添加到游戏对象的内部列表中,以节省一些时间我不做这些组件的成员变量,只有游戏对象是成员变量,如下所示:
void Initialize()
{
MeshComponent* meshRenderer = new MeshComponent(mesh, material);
m_GameObject.AddComponent(meshRenderer);
}
将meshRenderer变量添加到AddComponent()中的组件列表中,但在此函数末尾超出范围。
稍后(在游戏的更新/绘制循环中)调用此组件并且一切正常,尽管在初始化期间对象已超出范围。
我是否理解范围有问题,这样使用是否安全,或者我应该采取另一种方法(不必为每个组件制作成员变量)?
感谢您的帮助!
答案 0 :(得分:1)
首先,我建议你在开始像游戏引擎这样的大型项目之前更多地学习C ++。
超出范围的是meshRenderer
变量,其类型为MeshComponent*
,是指向MeshComponent
的指针。当指针超出范围时会发生什么?什么都没有。使用new
运算符在堆上分配内存,它将保留在那里,直到您使用delete
运算符解除分配。
答案 1 :(得分:1)
稍后(在游戏的更新/绘制循环中)调用此组件并且一切正常,尽管在初始化期间对象已超出范围。
那是因为在街区:
void Initialize()
{
MeshComponent* meshRenderer = new MeshComponent(mesh, material);
m_GameObject.AddComponent(meshRenderer);
}
堆栈中的变量是指针(meshRenderer
),指向的对象在堆上分配。
因此,当达到}
时,只有指针被“销毁”,但不是指向的对象。
这是动态内存错误的主要原因之一。
所以它应该“正确”工作,直到组件管理器正确处理动态内存(例如正确的释放)。
这样使用是否安全,或者我应该采取另一种方法(不必为每个组件制作成员变量)?
安全的相对概念。即使是对C或C ++动态内存有丰富经验的人也可能会犯一些错误,导致内存泄漏。
我建议你阅读并学习smart pointers。 [自C ++ 11 ]
智能指针简化了指针的概念,因为(如果正确使用)它会自动处理内存释放。
例如,在您的情况下,std::shared_ptr
可能很有用。
共享指针允许指向同一对象(相同内存)的多个指针实例。实际上,几个std::shared_ptr
个对象可能拥有相同的对象。当拥有该对象的最后一个shared_ptr被销毁(或程序员明确想要)时,该对象被销毁并释放其内存。
答案 2 :(得分:0)
稍后(在游戏的更新/绘制循环中)调用此组件并且一切正常,尽管在初始化期间对象已超出范围。
除非delete
位于其他地方,否则该组件不会超出范围。