0
    vector <string> inputarrayconverted = { ... };

    try
    {
    if (atoi(inputarrayconverted[p].c_str()) >= 0)
    {
        inputarrayconverted[p] = "n";
    }
}
catch (int e) { }`

不管用。它给了我一个“调试断言失败!” 信息。我要做的就是验证如果数组位置是 int,则将其值更改为“n”

错误是“调试断言失败!

文件:向量表达式:向量下标超出范围"

但是,为什么我的 try 块没有捕捉到这个?那是我的问题。

这是堆栈跟踪。(我相信)

msvcp100d.dll!590599f3()
[Frames below may be incorrect and/or missing, no symbols loaded for msvcp100d.dll] 
Paradigms Assignment 2 C Plus Plus.exe!std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::operator[](unsigned int _Pos=0)  Line 932 + 0x17 bytes C++
Paradigms Assignment 2 C Plus Plus.exe!wmain(int argc=1, wchar_t * * argv=0x00314af8)  Line 148 + 0x12 bytes    C++
Paradigms Assignment 2 C Plus Plus.exe!__tmainCRTStartup()  Line 552 + 0x19 bytes   C
Paradigms Assignment 2 C Plus Plus.exe!wmainCRTStartup()  Line 371  C
kernel32.dll!7647339a()     
ntdll.dll!77909ef2()    
ntdll.dll!77909ec5()    
4

2 回答 2

4

vector 上的operator[]()访问函数不会在越界访问时抛出异常——这只是未定义的行为。这个想法是知道它正在处理范围内的索引值的代码不应该为库不必要地仔细检查它而付出代价。

你得到一个调试断言是因为调试库确实执行了检查,但是以你看到的断言的形式。调试版本生成可以在调试版本中捕获但不能在发布版本中捕获的异常是不合适的。

如果你想要边界检查访问,使用vector::at()which 执行类似的访问,但是边界被检查并且会抛出异常:

成员函数 at() 提供对容器元素的边界检查访问。如果 n >= a.size(),at() 会抛出 out_of_range。

因此,您需要 catchstd::out_of_range而不是 a int,并且需要 a#include <stdexcept>来获取它的声明。

于 2012-05-01T05:04:46.050 回答
3

该变量p包含一个超出向量中元素数量范围的值。(它要么是负数,要么太大,要么数组是空的。)断言是告诉你在开发过程中出了什么问题,而异常处理运行时问题。我不太了解 Visual Studio,所以我不确定他们的标准库版本是否有一个可以设置为从断言切换到异常的标志。(也许只是构建发布呢?)

于 2012-05-01T04:52:58.170 回答