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()
答案 0 :(得分:4)
向量上的operator[]()
访问函数不会在越界访问上抛出异常 - 它只是未定义的行为。这个想法是知道它处理范围内的索引值的代码不应该为库不必要地加倍检查它。
您正在获得调试断言,因为调试库会执行检查,但是以您看到的断言的形式执行。调试版本生成可以在调试版本中捕获但不在发布版本中捕获的异常是不合适的。
如果要进行边界检查访问,请使用执行类似访问的vector::at()
,但会检查边界并抛出异常:
()的成员函数提供对容器的边界检查访问 元素。如果n&gt; = a.size(),at()会抛出out_of_range。
因此,您需要抓住std::out_of_range
而不是int
,并且您需要#include <stdexcept>
来获取声明。
答案 1 :(得分:3)
变量p
包含的值超出了向量中元素的数量。 (它是负数或太大,或者数组是空的。)断言是告诉你在开发过程中出现了问题,而异常则处理运行时问题。我不太了解Visual Studio,所以我不确定他们的标准库版本是否有一个标志,您可以将其设置为从断言切换到异常。 (也许只是构建版本吗?)