我知道向量元素破坏顺序不是由C++标准定义的(参见std :: vector元素的破坏顺序),我看到我检查过的所有编译器从头到尾都做了这个破坏 - 这对我来说非常令人惊讶动态和静态数组以相反的顺序执行,而这种相反的顺序在C++世界中经常出现.
要严格:我知道"容器成员......可以使用例如插入和擦除成员函数以任何顺序构造和销毁",并且我不投票支持"容器以保留某些记录这些更改".我只想投票将当前的矢量析构函数实现从前向破坏改为向后破坏元素 - 仅此而已.并且可能将此规则添加到C++标准中.
而原因呢?从数组到向量的变化会更加安全.
真实世界示例:我们都知道互斥锁定和解锁顺序非常重要.并确保解锁发生 - 使用ScopeGuard模式.然后销毁订单很重要.考虑这个例子.那里 - 从数组切换到向量会导致死锁 - 只是因为它们的破坏顺序不同:
class mutex {
public:
void lock() { cout << (void*)this << "->lock()\n"; }
void unlock() { cout << (void*)this << "->unlock()\n"; }
};
class lock {
lock(const mutex&);
public:
lock(mutex& m) : m_(&m) { m_->lock(); }
lock(lock&& o) { m_ = o.m_; o.m_ = 0; }
lock& operator = (lock&& o) {
if (&o != this) {
m_ = o.m_; o.m_ = 0; …Run Code Online (Sandbox Code Playgroud)