map/set 迭代器不兼容 [c++]
map/set iterators incompatible [c++]
我正在尝试遍历地图,如下所示:
data = &server->update();
for (auto const iter : *data)
{
do things
}
但是 for 行一运行,我就收到一条错误消息 "map/set iterators incompatible"。
数据变量是一个
std::map<unsigned int, Packet> *data;
它是一个指针,因为它位于:
public ref class ServerForm : public System::Windows::Forms::Form
这似乎不喜欢任何不是指针的东西。
我尝试了多种遍历此地图的方法,但每次尝试都完全失败。我真的很感激能深入了解为什么会发生这种情况以及如何解决它,谢谢。
data = &server->update();
// same as
data = &(server->update());
由于 update
函数 returns 按值,您将指针绑定到具有自动存储持续时间的实例,其生命周期以此行结束 (a "temporary")。
所以实际上,稍后在您的循环中
for(auto const it : *data)
您正在解除对无效指针的引用,这会产生未定义的行为。
真正让我吃惊的是代码甚至可以编译。我无法让这样的测试用例在 ideone/GCC.
中工作
要使用由更新函数 return 编辑的临时文件,您有以下可能性:
- 将地图存储在局部变量中。
通过将临时文件绑定到引用来延长临时文件的生命周期:
auto & map = server->update ();
这在调用堆栈中不起作用 "upwards",因此您不能 return 该引用。
将循环引入限制临时生命周期的完整表达式:
for (auto const it : server->update()) {
// ....
我正在尝试遍历地图,如下所示:
data = &server->update();
for (auto const iter : *data)
{
do things
}
但是 for 行一运行,我就收到一条错误消息 "map/set iterators incompatible"。
数据变量是一个
std::map<unsigned int, Packet> *data;
它是一个指针,因为它位于:
public ref class ServerForm : public System::Windows::Forms::Form
这似乎不喜欢任何不是指针的东西。
我尝试了多种遍历此地图的方法,但每次尝试都完全失败。我真的很感激能深入了解为什么会发生这种情况以及如何解决它,谢谢。
data = &server->update();
// same as
data = &(server->update());
由于 update
函数 returns 按值,您将指针绑定到具有自动存储持续时间的实例,其生命周期以此行结束 (a "temporary")。
所以实际上,稍后在您的循环中
for(auto const it : *data)
您正在解除对无效指针的引用,这会产生未定义的行为。
真正让我吃惊的是代码甚至可以编译。我无法让这样的测试用例在 ideone/GCC.
中工作要使用由更新函数 return 编辑的临时文件,您有以下可能性:
- 将地图存储在局部变量中。
通过将临时文件绑定到引用来延长临时文件的生命周期:
auto & map = server->update ();
这在调用堆栈中不起作用 "upwards",因此您不能 return 该引用。
将循环引入限制临时生命周期的完整表达式:
for (auto const it : server->update()) { // ....