visualc++中与reverse_iterator相关的崩溃.是法律条文吗?
reverse_iterator related crashes in Visual C++. Is it legal code?
我今天正在玩一些代码,并且非常惊讶地发现以下代码在Visual c++中崩溃。看起来还行吗?当我运行代码时,gcc输出1。英特尔也是。
#include <iostream>
#include <set>
#include <assert.h>
int main()
{
std::set<int> sampleSet;
sampleSet.insert(1);
sampleSet.insert(2);
sampleSet.insert(3);
std::set<int>::iterator normalIt(sampleSet.begin());
std::set<int>::reverse_iterator reverseIt(sampleSet.rbegin());
++normalIt;
++reverseIt;
int test1(*reverseIt); // 2
assert(*normalIt == *reverseIt); //they're both = 2
std::set<int>::iterator gonnaDelete((++reverseIt).base()); // gonnaDelete points to 2
int test2(*reverseIt); // 1
sampleSet.erase(gonnaDelete);
int test3(*reverseIt); // 1??? Visual Studio 2010 crashes here.... gcc is fine, but not sure if this is legal
std::cout << test3 << std::endl;
return 0;
}
不合法。根据[lib.associative]在c++ 98中,"erase成员只能使迭代器和对被擦除元素的引用无效。"因为reverse_iterator是这样定义的:
template<typename Iter>
class reverse_iterator {
Iter current;
Iter tmp;
public:
...
Iter base() { return current; }
reference operator*() {
tmp = current;
--tmp;
return *tmp;
}
};
当你擦除gonnaDelete
时,你也使reverseIt.current
无效,所以当你随后取消对reverseIt
的引用时,你会得到未定义的行为。
现在,set迭代器往往是指向节点的简单指针,优化的分配器有时会单独留下已删除节点的内存,因此代码有时会在您使其中一个无效之后碰巧做您期望的事情,但它根本不能保证工作。我怀疑vc++在默认情况下有一个调试模式来捕捉这种错误。要打开gcc的等效模式,请尝试使用-D_GLIBCXX_DEBUG
构建:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/manual/manual/bk01pt03ch17s03.html
std::vector::erase(i)使指向"i"之前的vector元素的所有迭代器失效
MSDN参考
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- visualc++中与reverse_iterator相关的崩溃.是法律条文吗?