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

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

【讨论】:

以上是关于向量下标超出范围,错误仅在调试模式下显示的主要内容,如果未能解决你的问题,请参考以下文章

调试断言失败,向量下标超出范围

C++ 调试断言失败。向量下标超出范围

调试断言失败(向量下标超出范围)

(opencv) 调试断言失败,向量下标超出范围

std::advance - 仅在调试时偏移超出范围失败

如何在 Linux 上强制执行向量下标超出范围调试断言