向量下标超出范围,错误仅在调试模式下显示
Posted
技术标签:
【中文标题】向量下标超出范围,错误仅在调试模式下显示【英文标题】:Vector subscript out of range, error only shown in debug mode 【发布时间】:2016-08-11 02:54:38 【问题描述】:Visual Studio Debug 显示异常“向量下标超出范围”(仅限调试模式),但我无法检测到它。没有错,是选择排序算法。
源代码:
#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
【问题讨论】:
【参考方案1】:在ascending_sort()
,
if (index != i)
T item = list[i];
list[i] = list[j];
list[j] = item;
您应该使用index
而不是j
,这可能是list.size()
在for
循环之后,然后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
。
【讨论】:
以上是关于向量下标超出范围,错误仅在调试模式下显示的主要内容,如果未能解决你的问题,请参考以下文章