2016-06-09 68 views
0

我对C++比较陌生,并且被一些奇怪的行为困惑。我得到一个包含std :: vector的对象。然后,我打印出它的两倍大小,由完全一样的复制行:C++ std :: vector :: size()更改其状态

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

“这里发生了什么,我该如何解决这个问题?”你的问题没有错,你的问题在别的地方。 – tkausl

+3

getCurrentPose()返回什么?有什么东西可以超出范围,或被摧毁? –

+0

'Pose&pose = getCurrentPose()'最有可能返回一个对无效的对象的引用。 –

回答

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. 
} 
+0

它看起来非常像你的第一个猜测...为什么这是危险的?为什么我不能以这种方式创建一个新对象,并在C++中返回它(或其指针)? –

+0

@ErikBrendel - 您可以返回'it'(或者更准确地说是它的一个副本),但不能返回指针/引用,因为指针引用的对象在函数退出时会被销毁。 – Roddy

+0

这不是不必要的复制开销吗?为什么创建一个对象只返回它的一个副本,如果原来不需要其他东西? –