C ++ std :: vector :: size()改变其状态

时间:2016-06-09 15:41:03

标签: c++ vector stdvector

我对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应用程序,可能是相关的。

1 个答案:

答案 0 :(得分:4)

我敢打赌,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.
}