我们目前正在建立一棵称为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指针将悬空。

10-06 13:58