【问题标题】:use erased element in map在地图中使用已擦除的元素
【发布时间】: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


【解决方案1】:

这永远不安全。当它从地图中移除时,它几乎肯定会被销毁。 (如果没有,什么时候?)

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多