我是C ++的新手,对某些奇怪的行为感到困惑。我得到一个包含std :: vector的对象。然后,通过完全相同的复制行将其尺寸打印两次:

    Pose& pose = getCurrentPose();
    std::cout << "nr1: " << pose.transforms.size() << " bones." << std::endl;
    std::cout << "nr2: " << pose.transforms.size() << " bones." << std::endl;


结果:

Nr1: 17 bones.
Nr2: 38294074 bones.


进一步调用此向量的大小将返回相同的巨大数字(应该为17)。

遍历向量时也会出现错误。在我看来,它实际上并没有调整大小,但是某种端点指针已损坏。这是怎么回事,如何解决这个问题?

这是getCurrentPose大致的样子:

Pose& getCurrentPose() {
    Pose& accu;

    for (int b = 0; b < p.transforms.size(); b++) {
        BoneState bs;
        accu->transforms.push_back(bs);
    }

    for (int b = 0; b < p.transforms.size(); b++) {
        accu->transforms.at(b).loc += getLoc(b);
        accu->transforms.at(b).rot += getRot(b);
        accu->transforms.at(b).scale += getScale(b);
    }

    return accu;
}


据我所知,我也不在任何地方使用多线程。这是一个OpenGL应用程序,可能与此相关。

最佳答案

我敢打赌,GetCurrentPose()看起来很危险。

Pose & GetCurrentPose()
{
  Pose p;
  p = something_magic();
  return p;
}


或者,按照您自己的答案...

Pose * GetCurrentPose()
{
  Pose p;
  p = something_magic();
  return &p;
}


两者都是确保混乱的可靠方法,它们返回指针和对具有左作用域的对象的引用。

正确的方法通常是按值返回。如果Pose对象由于某种原因不可复制,则需要非常仔细地考虑整个设计。

Pose GetCurrentPose()
{
  Pose p;
  p = something_magic();
  return p;  // theoretically this returns a copy of p, but the compiler can optimise out the copying step.
}

07-28 10:42