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.
该组件不会超出范围,除非在其他地方 delete
d。
首先,我建议你在开始像游戏引擎这样的大项目之前多学习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 被销毁(或程序员明确希望)时,该对象被销毁并释放其内存。
我正在使用 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.
该组件不会超出范围,除非在其他地方 delete
d。
首先,我建议你在开始像游戏引擎这样的大项目之前多学习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 被销毁(或程序员明确希望)时,该对象被销毁并释放其内存。