【问题标题】: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

【问题讨论】:

    标签: c++ sorting vector outofrangeexception


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多