【发布时间】:2017-04-07 18:16:07
【问题描述】:
我想知道我是否仍然可以在如下函数内访问/修改地图中已擦除元素的数据:
struct CustStruct {
int a;
int b;
};
void useAfterErase() {
map<int, CustStruct> myMap;
myMap[0] = {0,1};
myMap[3] = {2,3};
myMap[4] = {4,5};
auto itr = myMap.find(3);
auto & element = itr->second;
myMap.erase(itr);
// access after erased
element.a = 100;
element.b = 100;
cout << element.a << " " << element.b << endl;
}
假设它是单线程并且访问/修改是在删除之后在修改地图之前,那么访问/修改是否总是安全的?
【问题讨论】:
-
不,没有参考。未定义的行为。先复制一份
-
你有一个悬空引用,它不安全。
-
right after the deletion before the map is modified- 删除元素正在修改地图。 -
试图访问任何已删除的东西都是 UB。
-
请记住,它可能看起来适合您。这并不意味着它会一直有效。这就是未定义行为的本质,它可以产生任何行为,包括您可能期望的行为。
标签: c++ dictionary stl