Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;游戏引擎设计和超出范围的对象 我正在研究一个基于C++的基于组件的游戏引擎。各种组件被添加到gameobject对象的内部列表中,为了节省时间,我没有为这些组件创建成员变量,只有game对象是成员变量,如下所示: void Initialize() { MeshComponent* meshRenderer = new MeshComponent(mesh, material); m_GameObject.AddComponent(meshRenderer); }_C++_Scope_Game Engine - Fatal编程技术网

c++;游戏引擎设计和超出范围的对象 我正在研究一个基于C++的基于组件的游戏引擎。各种组件被添加到gameobject对象的内部列表中,为了节省时间,我没有为这些组件创建成员变量,只有game对象是成员变量,如下所示: void Initialize() { MeshComponent* meshRenderer = new MeshComponent(mesh, material); m_GameObject.AddComponent(meshRenderer); }

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>首先,我建议你在开

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

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

我是否理解范围有什么错误,像这样使用是否安全,或者我是否应该采取另一种方法(不必为每个组件创建成员变量)

谢谢你的帮助

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


<>这个组件不会超出范围,除非是代码>删除< /代码>其他地方。

< 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”。