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
Post a Comment