gpt4 book ai didi

c++ - 设置因 move 语义而无效的迭代器

转载 作者:行者123 更新时间:2023-11-30 03:44:27 25 4
gpt4 key购买 nike

我有以下不可变容器类(对 values 的公共(public)访问只是为了简单起见):

struct Container
{
std::unordered_set<int> values;

//Default constructor
Container() = default;

//Copy constructor
Container(const Container& other)
: values(other.values)
{ }

//Move constructor
Container(const Container&& other)
: values(std::move(other.values))
{ }

Container RemoveValue(int value) const
{
//Create a copy of this object
Container copy(*this);
//Remove one element from the copy
copy.values.erase(value);
return copy;
}
};

此容器包含一组值。 RemoveValue() 方法返回已删除特定值的当前对象的拷贝。为此结构定义了适当的 move 构造函数。

我使用这个容器如下:

int main() 
{
std::vector<Container> containers;

{
//Initialization
Container initialContainer;
initialContainer.values.insert(1);
initialContainer.values.insert(2);

containers.push_back(std::move(initialContainer));
}

const Container* currentContainer = &containers.front();
for (int value : currentContainer->values)
{
Container newContainer = currentContainer->RemoveValue(value);

//Do some checks, then...
containers.push_back(std::move(newContainer));
}

std::cout << containers.size() << std::endl;

return 0;
}

我用单个容器(值为 1 和 2)初始化容器 vector 。然后,我获得一个指向这个初始元素的指针并迭代每个值。对于每个值,我调用 RemoveValue() 并将生成的容器插入 vector 中。

在 gcc 中,这似乎工作得很好。但是,我在 Visual Studio 2015 中遇到运行时错误。

在 Debug模式下,错误是:“列表迭代器不可递增”。此错误发生在 for (int value : currentContainer->values) 的第一次迭代之后(当要递增迭代器时)。

在 Release模式下,错误是:“访问位置 0x38 处的读取违规”。此错误发生在 RemoveValue 中的 copy.values.erase(value) 处。但仅限于第二次迭代。令人惊讶的是,values 此时不再包含元素(size() 返回 0)。

我不明白这些错误中的任何一个。我该如何解决它们?

A C++ Shell example也运行无误。但是,它输出 2 作为容器的最终数量,而我预期是三个(第一个,一个删除了 1,一个删除了 2已删除)。

最佳答案

currentContainer 是指向 vector containers 元素的指针。循环体通过调用 push_back 修改 containers。这会使指向 vector 的指针无效,如果确实如此,currentContainer 可能最终指向垃圾。

一般来说,不要使用指向保存在 std::vector 中的对象的指针。相反,使用 containers.front()containers[0] 获取第一个元素。

关于c++ - 设置因 move 语义而无效的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35462642/

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