2013-10-08 46 views
1

有人可以解釋我爲什麼這個C++代碼它的行爲是這樣嗎? 而且..如何避免將來出現這個「矢量」問題。從向量的元素成員方法插入向量元素破壞*這

#include <iostream> 
#include <vector> 
using namespace std; 
struct my_str { 
    int x; 
    my_str() { 
     x = 0; 
    } 
    void insert(); 
}; 
vector<my_str> p; 

void my_str :: insert() { 
    p.push_back(my_str()); 
    x = 123; 
} 

int main() { 
    p.push_back(my_str()); 
    p[0].insert(); 
    cerr << p[0].x; 
    return 0; 
} 
+1

你是什麼意思「破壞'*這個'」?這段代碼的行爲如何影響你? – delnan

+0

@delnan:我想這顯示「0」,而不是「123」(http://ideone.com/jyagJK)。 –

回答

4

p.push_back(my_str());void my_str :: insert()

導致矢量重新分配,this無效

x = 123; 

BOOM!堆腐敗。

爲了避免將來出現此類問題,請不要編輯它們包含的對象中的矢量。 或者,如果必須,請確保在此之後不使用對象成員。

+0

這發生在我實現了一個trie類。 爲此,我優先使用矢量贊成clasic指針兒童(因爲指針較慢)..是我的方法如此錯誤? –

+0

如果你需要你自己的向量壞樹 - 只是在所有對象的成員修改後修改向量。請記住,所有指針都可能無效(只能使用索引)。並且要小心。 –

+0

@AlexVelea或者,您可以將'vector '更改爲'vector >'。這可能更有意義,因爲如果將所有的trie節點存儲在向量中,則必須在每次重新分配時複製節點,如果要在每個節點中存儲大型數據類型,這可能會非常昂貴。分別分配節點並使用指針向量來管理排序更有意義。 –