c ++游戏引擎设计和对象超出范围

时间:2016-09-04 13:00:12

标签: c++ scope game-engine

我正在使用C ++开发基于小组件的游戏引擎。各种组件被添加到游戏对象的内部列表中,以节省一些时间我不做这些组件的成员变量,只有游戏对象是成员变量,如下所示:

void Initialize()
{     
   MeshComponent* meshRenderer = new MeshComponent(mesh, material);
   m_GameObject.AddComponent(meshRenderer);
}

将meshRenderer变量添加到AddComponent()中的组件列表中,但在此函数末尾超出范围。

稍后(在游戏的更新/绘制循环中)调用此组件并且一切正常,尽管在初始化期间对象已超出范围。

我是否理解范围有问题,这样使用是否安全,或者我应该采取另一种方法(不必为每个组件制作成员变量)?

感谢您的帮助!

3 个答案:

答案 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位于其他地方,否则该组件不会超出范围。