c++;游戏引擎设计和超出范围的对象 我正在研究一个基于C++的基于组件的游戏引擎。各种组件被添加到gameobject对象的内部列表中,为了节省时间,我没有为这些组件创建成员变量,只有game对象是成员变量,如下所示: void Initialize() { MeshComponent* meshRenderer = new MeshComponent(mesh, material); m_GameObject.AddComponent(meshRenderer); }
meshRenderer变量正在添加到AddComponent()中的组件列表中,但在该函数结束时超出范围 稍后(在游戏的更新/绘制循环中)调用该组件,并且一切正常,尽管对象在初始化过程中已超出范围 我是否理解范围有什么错误,像这样使用是否安全,或者我是否应该采取另一种方法(不必为每个组件创建成员变量) 谢谢你的帮助 稍后(在游戏的更新/绘制循环中)调用该组件,并且一切正常,尽管对象在初始化过程中已超出范围c++;游戏引擎设计和超出范围的对象 我正在研究一个基于C++的基于组件的游戏引擎。各种组件被添加到gameobject对象的内部列表中,为了节省时间,我没有为这些组件创建成员变量,只有game对象是成员变量,如下所示: void Initialize() { MeshComponent* meshRenderer = new MeshComponent(mesh, material); m_GameObject.AddComponent(meshRenderer); },c++,scope,game-engine,C++,Scope,Game Engine,meshRenderer变量正在添加到AddComponent()中的组件列表中,但在该函数结束时超出范围 稍后(在游戏的更新/绘制循环中)调用该组件,并且一切正常,尽管对象在初始化过程中已超出范围 我是否理解范围有什么错误,像这样使用是否安全,或者我是否应该采取另一种方法(不必为每个组件创建成员变量) 谢谢你的帮助 稍后(在游戏的更新/绘制循环中)调用该组件,并且一切正常,尽管对象在初始化过程中已超出范围 这个组件不会超出范围,除非是代码>删除< /代码>其他地方。 < P>首先,我建议你在开
<>这个组件不会超出范围,除非是代码>删除< /代码>其他地方。 < P>首先,我建议你在开始游戏引擎之类的大项目之前先学习C++更多。 超出范围的是
meshRenderer
变量,该变量的类型为MeshComponent*
,它是指向MeshComponent
的指针。指针超出范围时会发生什么情况?什么都没有。内存是使用new
操作符在堆上分配的,在您使用delete
操作符解除分配之前,它将一直保留在那里
稍后(在游戏的更新/绘制循环中)调用此组件,并且一切正常,尽管对象在初始化过程中已超出范围
那是因为在街区里:
void Initialize()
{
MeshComponent* meshRenderer = new MeshComponent(mesh, material);
m_GameObject.AddComponent(meshRenderer);
}
堆栈中的变量是指针(meshRenderer
),指向的对象在堆上分配。
因此,当到达}
时,只有指针被“销毁”,而不是指向的对象
这是导致动态内存错误的主要原因之一
因此,在组件管理器正确处理动态内存(例如,正确的释放)之前,它应该“正确”工作
这样使用安全吗?或者我应该采取另一种方法(不必为每个组件创建成员变量) 安全是一个相对的概念。即使是在C或C++动态存储器中有丰富经验的人也会犯一些错误,产生内存泄漏。 我可以建议你阅读和学习。[自C++11以来] 智能指针简化了指针的概念,因为(如果正确使用)它会自动处理内存释放 例如,在您的情况下,一个
共享指针允许引用同一对象(同一内存)的多个指针实例。实际上,几个
std::shared_ptr
对象可能拥有同一个对象。当拥有该对象的最后一个剩余共享\u ptr被销毁(或程序员明确想要)时,该对象被销毁,其内存被释放。+1尽管我会使用unique\u ptr,或者对共享\u ptr所有权要求严格,并且只将弱\u ptr返回给用户。注意,这在纯粹主义者中并不流行,他们认为每一个智能指针背后都隐藏着性能问题。@Robinson我完全同意你的观点。事实上,我很少使用智能指针,但我的工作场景总是关于低级算法。相反,在游戏引擎中,我经常看到它们,尤其是在组件管理器系统中,共享指针是常用的。我强烈建议使用make_shared(共享指针)或make_unique,或者至少了解它们,而不是“new”和“delete”。