c++ - 指向地址的指针似乎超出了范围

标签 c++ pointers

我们目前正在构建一些树,称为 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 中的原始 BVHSetGeometry 函数退出时被销毁,因此剩余的 root 指针变为悬空。

关于c++ - 指向地址的指针似乎超出了范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59375112/

相关文章:

c++ - std::atomic 与用于线程同步的静态变量

c++ - 错误 : My every function & variable 'was not declared in this scope (code;;blocks, C++)

c++ - 将字符串变量传递给 boost::ASIO 读取器/处理程序会导致段错误

c# - 你能通过内存位置而不是内容来比较字符串吗?

c++ - 如何在 C++ 中将指向基类的指针分配给派生类的对象?

java - java中双向循环链表的插入

c++ - std::less<Pointer> 的严格总顺序

c++ - 为什么 gcov 报告一个使用良好的类的头文件覆盖率为 0%?

pointers - 为什么Go的package标志使用指针?

使用双指针创建二维数组