我们目前正在建立一棵称为BVH的树。要构建它,我们有一个大池,其中包含可能存在的最大节点数。
在构建树的根节点时,我们指向池中包含相应节点信息的地址。
因此,我们有:
class BVHNode
{
int leftFirst;
//some stuff
}
class BVH
{
vector<BVHNode> pool;
BVHNode* root;
//some more stuff
}
BVH::ConstructBVH()
{
// some stuff
(*this).pool.resize(maxNodesNr);
(*this).root = &pool[0];
(*this).root->leftFirst = 0;
//more stuff
}
然后,我们有了SetGeometry方法,在其中调用bvh构造,并将生成的bvh保存到场景中。
RenderCore::SetGeometry()
{
Timer timer; //nothing important
Mesh newMesh = Mesh();
//some stuff to copy vertices to newMesh
newMesh.bvh.ConstructBVH();
raytracer.scene.meshList.push_back(newMesh);
printf("newMesh contains correct root!");
}
现在,如果我们在printf处放置一个断点,则bvh.root将显示正确的leftFirst。
如果我们在Timer计时器上放置另一个断点,则下次我们到达该断点时,root-> leftFirst将显示-572662307。我认为表明它指向一个随机的内存位置。
pool [0]本身仍显示正确的信息。
在SetGeometry调用之间,bvh中没有任何改变。
我认为可能是某些东西超出SetGeometry范围时具有未定义的行为,但是我无法确定确切的原因和原因,因为只有根似乎已更改,而bvh中的其余部分似乎仍然有效。如果您有任何建议,我将不胜感激。
最佳答案
如注释中所述,raytracer.scene.meshList.push_back(newMesh);
将newMesh
的副本推入meshList
。
由于BVH
没有用户定义的副本构造函数,因此默认的副本构造函数将root
分配为指向与原始副本相同的pool
。
当退出BVH
函数时,由于newMesh
中原始的SetGeometry
被破坏,因此剩余的root
指针将悬空。