unordered_map中的破坏顺序

时间:2015-07-11 18:48:20

标签: c++ standard-library

我有一个unordered_map对象。每个对象在其析构函数中浏览无序映射以查找其他对象,然后调整这些其他对象。如果其他对象是僵尸对象,这将失败,但如果其他对象完全从unordered_map中删除,则没有问题。

我的问题:

  1. 如果我擦除()一个对象,并且它的析构函数试图在无序映射中查找自己,这是否有效?具体来说,是第一个调用析构函数,还是首先从unordered_map中删除对象,还是没有保证?
  2. 如果unordered_map被销毁,
  3. 是否可行?具体来说,unordered_map是否会在调用每个单独的析构函数时处于有效状态?

1 个答案:

答案 0 :(得分:3)

  

如果T是具有非平凡析构函数(12.4)的类类型,则类型T的对象的生命周期结束,析构函数调用开始[...]

     

[§3.8/ 1 N4431]

而且,进一步下来

  

本国际标准中归属于对象的属性仅适用于给定对象的生命周期

     

[§3.8/ 3 N4431]

最后

  

[...]在对象的生命周期结束后,可以使用任何指向对象将要或所在的存储位置的指针,但只能以有限的方式使用。 [...]如果指针用于访问非静态数据成员或调用对象的非静态成员函数,则程序具有未定义的行为[...]

     

[§3.8/ 5 N4431]

所以,既然你必须有一些引用(例如一个指针或一个真正的引用,我在这里也算作指针),它的生命周期已经结束,访问一个成员函数(到得到一个迭代器,例如)will - 据我读到这部分标准 - 导致未定义的行为。

我一直在查看关于无序容器和容器的标准部分,并且在销毁过程中找不到上述或关于状态的任何线索的例外。

所以:不要这样做。既没有无序容器,也没有任何其他物体。

顺便说一句:当你对那些在此后被破坏的物体上进行什么样的调整时会有什么意义呢?