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