gpt4 book ai didi

c++ - move 和删除后对象的容器字段为空

转载 作者:行者123 更新时间:2023-11-28 02:25:28 24 4
gpt4 key购买 nike

我有两个 vector ,我想将一个对象从一个 vector move 到另一个 vector ,在 move 它之前,我创建了一个指向该对象的指针。但是当我删除第一个 vector 中的索引时,如果我通过指针访问它,则对象内的容器为空。很难描述,一些代码会更好地解释它:

Word.h

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

string text;
};

卡片.h

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

vector<Word> words;
};

主要()

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();

最佳答案

move 没有效果,因为 Card 没有 move 构造函数或 move 赋值运算符。 vector 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]

关于c++ - move 和删除后对象的容器字段为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30827872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com