矢量下标超出范围,错误仅在调试模式下显示
Vector subscript out of range, error only shown in debug mode
Visual Studio Debug显示异常"Vector下标超出范围"(仅调试模式),但我无法检测到它。没有问题,这是选择排序算法。
源代码:#include <iostream>
#include <vector>
using namespace std;
template<typename T>
void ascending_sort(vector<T> & list) {
size_t i, j, index;
for (i = 0; i < list.size() - 1; i++) {
index = i;
for (j = i + 1; j < list.size(); j++) {
if (list[j] < list[index]) {
index = j;
}
}
if (index != i) {
T item = list[i];
list[i] = list[j];
list[j] = item;
}
}
}
int main(int argc, char * argv[]) {
vector<int> list = { 5, 1, -14, 8 };
ascending_sort(list);
for (size_t i = 0; i < list.size(); i++) {
cout << list[i] << endl;
}
return 0;
}
输出:0
5
-14
8
在ascending_sort()
中
if (index != i) {
T item = list[i];
list[i] = list[j];
list[j] = item;
}
您应该使用index
而不是j
, for
循环后可能是list.size()
,那么list[j]
会导致范围外问题。改为
if (index != i) {
T item = list[i];
list[i] = list[index];
list[index] = item;
}
std::vector::operator[]
不执行边界检查,当下标超出范围时会导致未定义的行为。似乎VS会在DEBUG模式下抛出异常,但这并不是标准所保证的。您可以使用std::vector::at
,当下标超出范围时,它将抛出std::out_of_range
相关文章:
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 在调试模式下引发C++ "deque iterator not dereferencable"异常
- _mm256_load_ps调试模式下导致谷歌/基准测试的分段错误
- Visual Studio 发布模式阻止在调试模式下执行的代码.使用 WinHTTP 和多线程
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- 使用Qt Creator在调试模式下编译一段代码
- 在调试模式下,所有程序都运行良好,但在发布模式下,我在cudaMalloc操作中出错
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 在调试模式下编译时qrc_resource.cpp错误
- 如何在调试模式下通过终端运行可执行的 c++?
- 在Visual Studio 2017上无法使用调试模式x64进行OpenCV3.2编译
- 在调试模式下使用英特尔 TBB
- 我的代码在发布模式下不起作用,而在Qt的调试模式下工作
- SCANF 在 Eclipse 中不接受调试模式下的输入?
- 为什么我的 UWP 游戏在发布时比在调试模式下慢
- 未处于调试模式时正常启动测试
- 我如何调用在调试模式下具有主要的程序或代码
- 在CLION中调试模式和运行模式之间的怪异结果
- 调试模式下的dlib静态lib错误
- ifstream读取二进制文件在发行模式下工作,但在调试模式下不使用