我有一个unordered_map对象。每个对象在其析构函数中浏览无序映射以查找其他对象,然后调整这些其他对象。如果其他对象是僵尸对象,这将失败,但如果其他对象完全从unordered_map中删除,则没有问题。
我的问题:
答案 0 :(得分:3)
如果T是具有非平凡析构函数(12.4)的类类型,则类型T的对象的生命周期结束,析构函数调用开始[...]
[§3.8/ 1 N4431]
而且,进一步下来
本国际标准中归属于对象的属性仅适用于给定对象的生命周期
[§3.8/ 3 N4431]
最后
[...]在对象的生命周期结束后,可以使用任何指向对象将要或所在的存储位置的指针,但只能以有限的方式使用。 [...]如果指针用于访问非静态数据成员或调用对象的非静态成员函数,则程序具有未定义的行为[...]
[§3.8/ 5 N4431]
所以,既然你必须有一些引用(例如一个指针或一个真正的引用,我在这里也算作指针),它的生命周期已经结束,访问一个成员函数(到得到一个迭代器,例如)will - 据我读到这部分标准 - 导致未定义的行为。
我一直在查看关于无序容器和容器的标准部分,并且在销毁过程中找不到上述或关于状态的任何线索的例外。
所以:不要这样做。既没有无序容器,也没有任何其他物体。
顺便说一句:当你对那些在此后被破坏的物体上进行什么样的调整时会有什么意义呢?