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

c++ game engine design and objects going out of scope

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

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

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

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

我对作用域的理解有误吗,这样使用是否安全,或者我应该采用另一种方法(不必为我的每个组件创建成员变量)吗?

感谢您的帮助!

Later on (in the game's update/draw loops) this component is called and everything works, despite the object having gone out of scope during initialization.

该组件不会超出范围,除非在其他地方 deleted。

首先,我建议你在开始像游戏引擎这样的大项目之前多学习C++。

超出范围的是 MeshComponent* 类型的 meshRenderer 变量,即指向 MeshComponent 的指针。当指针超出范围时会发生什么?什么都没有。内存是使用 new 运算符在堆上分配的,它将一直保留在那里,直到您使用 delete 运算符释放它。

Later on (in the game's update/draw loops) this component is called and everything works, despite the object having gone out of scope during initialization.

那是因为在块中:

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

栈中的变量是指针meshRenderer),指向的对象分配在上。 因此,当到达 } 时,只有指针是 "destroyed" 而 不是 指向的对象。

这是导致动态内存出错的主要原因之一。

所以它应该工作 "correctly" 直到组件管理器正确处理动态内存(例如正确的释放)。


is it safe to use like this or is there another approach I should take (without having to make member variables of each of my components)?

安全一个相对的概念。即使是在 C 或 C++ 动态内存方面具有丰富经验的人也可能会犯一些错误,导致 内存泄漏

我可以建议您阅读和学习 smart pointers。 [自 C++11]

智能指针简化了指针的概念,因为(如果使用正确)它会自动处理内存释放。

例如,对于您的情况,std::shared_ptr 可能会有用。

A 共享指针 允许引用同一对象(同一内存)的多个指针实例。实际上,多个 std::shared_ptr 对象可能拥有同一个对象。当拥有该对象的最后一个剩余 shared_ptr 被销毁(或程序员明确希望)时,该对象被销毁并释放其内存。