2015-06-14 40 views
0

我有兩個向量,我想在將對象從一個移動到另一個之前移動它,然後製作一個指向該對象的指針。但是當我刪除第一個向量中的索引時,如果通過指針訪問對象內的容器是空的。這很難形容,一些代碼將更好地解釋它:移動和擦除後,對象的容器字段爲空

Word.h

class Word 
{ 
public: 
    Word(string text); 
    ~Word(); 

    string text; 
}; 

Card.h

class Card 
{ 
public: 
    Card(vector<Word>& words); 
    ~Card(); 

    vector<Word> words; 
}; 

的main()

vector<Word> words { 
    Word("dog"), 
    Word("cat"), 
    Word("horse") 
}; 

Card card(words); 

vector<Card> deck1; 
vector<Card> deck2; 

deck1.push_back(move(card)); 

Card* p = &deck1[0]; 
deck2.push_back(move(deck1[0])); 
cout << p->words.size() << endl; // 3 

deck1.erase(deck1.begin()); 

cout << p->words.size() << endl; // 0 <-- Why is size() 0 here? 

p = &deck2[0]; 
cout << deck2[0].words.size() << endl; // 3 <-- and 3 here 
cout << p->words.size() << endl; // <-- and 3 here! 

getchar(); 

回答

2

這些舉措都沒有效果,因爲Card沒有移動構造函數或移動賦值運算符。載體deck1deck2包含任何被推入它們的副本。

但是這個問題(或者至少是一個問題)是當您從deck1中刪除時,您無效p。取消引用p是未定義的行爲(UB)。

deck1.push_back(move(card)); 
Card* p = &deck1[0]; 
.... 
deck1.erase(deck1.begin()); // p invalidated 
.... 
cout << p->words.size() << endl; // UB, anything can happen 

p = &deck2[0]; 
cout << deck2[0].words.size() << endl; 
cout << p->words.size() << endl; // No problem, p points to deck2[0] 
+0

我以爲我開始明白移動語義,但我明白我出錯的地方,謝謝! – Jesse

相關問題