我们目前正在构建一些树,称为 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
的 拷贝 推送到 网格列表
.
由于 BVH
没有用户定义的复制构造函数,默认复制构造函数将 root
分配给指向与原始相同的 pool
。
由于 newMesh
中的原始 BVH
在 SetGeometry
函数退出时被销毁,因此剩余的 root
指针变为悬空。
关于c++ - 指向地址的指针似乎超出了范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59375112/