gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:50:23 24 4
gpt4 key购买 nike

我是 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.

对该 vector 大小的任何进一步调用都会返回相同的巨大数字(17 应该是正确的)。

我在遍历 vector 时也遇到错误。在我看来,它实际上并没有调整大小,但是某种端点指针被破坏了。这里发生了什么,我该如何解决这个问题?

这是 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.
}

关于C++ std::vector::size() 改变它的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37730549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com