c++ - Object's container field is empty after move and erase -


i have 2 vectors , want move object 1 other, before move make pointer object. when erase index in first vector container within object empty if access through pointer. it's difficult describe, code explain better:

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 size() 0 here?  p = &deck2[0]; cout << deck2[0].words.size() << endl; // 3 <-- , 3 here cout << p->words.size() << endl; // <-- , 3 here!   getchar(); 

the moves have no effect because card has no move constructor or move assignment operator. vectors deck1 , deck2 contain copies of whatever pushed them.

but problem (or @ least, 1 problem) invalidate p when erase deck1. de-referencing p undefined behaviour (ub).

deck1.push_back(move(card)); card* p = &deck1[0]; .... deck1.erase(deck1.begin()); // p invalidated .... cout << p->words.size() << endl; // ub, can happen  p = &deck2[0]; cout << deck2[0].words.size() << endl; cout << p->words.size() << endl; // no problem, p points deck2[0] 

Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -