C 98/C 03 STL设置错误
C++98/C++03 STL set bug?
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或更早的情况下,将临时对象的副本放在CList
和CList
内部的BList
上。
复制C::BList
成员时,创建了一个全新的list<B>
,但是当复制C::BListIter
成员时,新的C::BListIter
ITERATOR仍然涉及原始C
对象中的C::BList
列表 - 这是被破坏的临时性。因此迭代器是指被摧毁的列表的元素。
在C 11中使用MOVE构造函数代替复制构造函数,因此所得的迭代器不参考死对象。
相关文章:
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 设置 Visual Studio for MPI: 找不到标识符错误
- 变量被错误地设置为 204
- Cython 包含catkin_pkg设置的错误
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- error_code:如何设置和检查错误
- 使用pcl库设置错误
- 具有C++设置错误的用户对象
- C 98/C 03 STL设置错误
- 提升静态链接提升区域设置错误
- OSX 区域设置错误
- 如何设置错误处理语句的格式
- 当参数是目录时,ifstream open() 不会设置错误位
- STL映射,设置错误:内存超出分配块的末尾
- W10 + Clion,设置错误
- 使用 Boost JSON 解析器时出现 JSON 格式设置错误
- 使用OpenGL的Qt项目设置错误
- 测试设置错误:测试树为空
- 在链表中插入似乎将下一个指针设置错误
- 如何在MFC应用程序退出时设置错误级别