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

Posted

技术标签:

【中文标题】C++ std::vector::size() 改变它的状态【英文标题】:C++ std::vector::size() changes its state 【发布时间】:2016-06-09 15:41:02 【问题描述】:

我对 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&amp; pose = getCurrentPose(); 很可能返回一个对不再有效的对象的引用。 其他线程还有进程吗? 嗯...什么编译器允许这样做 - Pose&amp; accu;? 【参考方案1】:

我敢打赌,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++ 中返回它(或其指针)? @ErikBrendel - 您可以返回“它”(或者更准确地说,它的副本),但不能返回指针/引用,因为指针指向的对象在函数时被销毁退出。 这不是不必要的复制开销吗?如果其他任何东西都不需要原始对象,为什么要创建一个仅返回其副本的对象? 复制(如果发生)对您完全不可见,并且允许编译器对其进行优化(google NRVO)。要了解为什么需要复制,您需要知道对象是如何(以及在​​何处)在堆栈上创建的,以及调用函数期望如何接收返回给它的对象。 @ErikBrendel 别担心,你的编译器在编译代码后会问自己同样的事情,并为你“省略”副本。性能不用担心,机器可以帮你搞定

以上是关于C++ std::vector::size() 改变它的状态的主要内容,如果未能解决你的问题,请参考以下文章

请区分c++编程时用到的单词length和size

为啥 std::vector max_size() 函数会返回 -1?

std::vector size()-1 是不是总是给出最后一个元素的索引?

C++实现静态顺序表的增删查改以及初始化

求大神改一下贪吃蛇C++代码

从数据结构和C++变为408!211福州大学计算机改考!