2016-06-09 29 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

這不是不必要的複製開銷嗎?爲什麼創建一個對象只返回它的一個副本,如果原來不需要其他東西? –

相關問題