矢量下标超出范围,错误仅在调试模式下显示

Vector subscript out of range, error only shown in debug mode

本文关键字:调试 模式 显示 错误 下标 范围      更新时间:2023-10-16

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