我知道,向量元素破坏为了不被C ++标准定义(见一个std ::向量的元素销毁顺序 ),我看到了,我检查了所有的编译器做到这一点的破坏,从开始到结束-这是相当令人惊讶的我,因为动态和静态数组做以相反的顺序,这相反的顺序是经常在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;
}
return *this;
}
~lock() { if (m_) m_->unlock(); }
private:
mutex* m_;
};
mutex m1, m2, m3, m4, m5, m6;
void f1() {
cout << "f1() begin!\n";
lock ll[] = { m1, m2, m3, m4, m5 };
cout <<; "f1() end!\n";
}
void f2() {
cout << "f2() begin!\n";
vector<lock> ll;
ll.reserve(6); // note memory is reserved - no re-assigned expected!!
ll.push_back(m1);
ll.push_back(m2);
ll.push_back(m3);
ll.push_back(m4);
ll.push_back(m5);
cout << "f2() end!\n";
}
int main() {
f1();
f2();
}
OUTPUT - 见从f1()到f2的破坏顺序变化()
f1() begin!
0x804a854->lock()
0x804a855->lock()
0x804a856->lock()
0x804a857->lock()
0x804a858->lock()
f1() end!
0x804a858->unlock()
0x804a857->unlock()
0x804a856->unlock()
0x804a855->unlock()
0x804a854->unlock()
f2() begin!
0x804a854->lock()
0x804a855->lock()
0x804a856->lock()
0x804a857->lock()
0x804a858->lock()
f2() end!
0x804a854->unlock()
0x804a855->unlock()
0x804a856->unlock()
0x804a857->unlock()
0x804a858->unlock()