C 98/C 03 STL设置错误

C++98/C++03 STL set bug?

本文关键字:设置 错误 STL      更新时间:2023-10-16

all,

当我使用set时,会发生一件奇怪的事情:假设:

struct A {
  int num;
  bool operator<(const A& x) const
  {
    return num < x.num;
  }
};
struct B {
  set<A> ASet;
};
struct C {
  list<B> BList;
  list<B>::iterator BListIter;
  C()
  {
    BList.push_back(B());
    BListIter = --(BList.end());
  }
};

在某个地方我们可以拥有此代码:

list<C> CList;
CList.push_back(C());
list<C>::iterator CListIter = --(CList.end());
for (...) {
  A a = ...;
  ...
  CListIter->BListIter->ASet.insert(a);

这将在几次迭代后最终导致分割故障。发生这种情况时,我发现插入过程中引用并比较了一个无效的项目(其地址为0x0000001b,所以绝对是错误的)。

有趣的是,当我打开-std = C 0x时,使用C 11的选项问题出现了!因此,我想知道这是否是C 98/C 03中设置的错误的错误?

谢谢,

凯文

在C 03或更早的情况下,将临时对象的副本放在CListCList内部的BList上。

复制C::BList成员时,创建了一个全新的list<B>,但是当复制C::BListIter成员时,新的C::BListIter ITERATOR仍然涉及原始C对象中的C::BList列表 - 这是被破坏的临时性。因此迭代器是指被摧毁的列表的元素。

在C 11中使用MOVE构造函数代替复制构造函数,因此所得的迭代器不参考死对象。