为什么我的for循环在双精度向量上崩溃了
Why is my for loop crashing on a vector of doubles?
这个for循环总是立即崩溃:
for (auto i = v.size() - 1; i >=0; --i);
显然我在循环中有一大堆代码,而v是一个双精度型的向量。我正试图以相反的顺序遍历它们。
这是怎么回事?
for (auto i = v.size() - 1; i >=0; --i);
看看vector::size()方法-它通常返回unsigned int(在奇怪的平台上可能是其他unsigned类型)!因此您的i
变量将具有unsigned类型。
当你的循环将到达步骤i == 0
时,它将递减它,i
将具有值2^32 - 1 == UNSIGNED_INT_MAX
(或其他正值,如果你在陌生的平台上工作-请参阅平台上的vector::size_type以查看底层类型)。所以它永远不会小于0,它永远不会停止循环。我猜当它变得如此之大时,它会崩溃,因为它超出了范围,但我没有看到完整的代码来确定。
看这里-查找size_type
typedef -它说它的unsigned类型。
你可能想使用反向迭代器(参见@NathanOliver的回应),尽管我不太喜欢在简单的循环中使用它们。
由于i
是无符号的,所以它永远不会小于0。它将绕行到它所能容纳的最大值。
如果你想对一个矢量进行反向迭代,那么你应该使用reverse_iterator
std::vector<int> foo = {1,2,3,4,5,6,7,8,9};
for (auto it = foo.rbegin(); it != foo.rend(); ++it)
std::cout << *it << " ";
这将输出
9 8 7 6 5 4 3 2 1
变量i将为unsigned类型
不可能小于0。
最终你将访问vector之外的元素,因为i将绕到最大可能的无符号值,而不是负
芭丝谢芭的话:auto类型是无符号的。因此,递减0变成一个大的正数,即>= 0,因此循环继续,但该值超出了向量的范围,并导致崩溃。
相关文章:
- 智能指针的排序向量:神秘崩溃
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- C++线程的向量在连接时随机崩溃
- C++ 尝试向类内的数组(或向量)添加值时程序崩溃
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 当通过结构中的指针引用COM_PTR的向量时,向量大小未知时崩溃
- 返回向量<对<字符串,字符串>>会导致 gcc 编译代码 (curlcpp) 崩溃
- 程序崩溃,说向量不超出范围异常
- 崩溃,如果使用向量删除了一个嵌入式容器的destructor中删除char*成员
- C++崩溃:push_back嵌套向量
- 计算向量::empty()正在使程序崩溃
- 在RELEASE配置中使用向量push_back时,C++代码崩溃
- c++迭代程序在向量上迭代时崩溃
- 自定义分配器有时会与stl向量一起崩溃
- 每当我输入长度为4的字符串时,下面的cpp代码就会崩溃(向量中的malloc失败)
- 处理大向量会使程序崩溃并带有bad_alloc
- 传递一个向量作为参数并使用它,它为什么会崩溃
- C++向量迭代器:erase() 最后一个项目崩溃
- 当 C 中的对象向量中有太多lua_state时,lua_close() 崩溃