vector <string> inputarrayconverted = { ... };
try
{
if (atoi(inputarrayconverted[p].c_str()) >= 0)
{
inputarrayconverted[p] = "n";
}
}
catch (int e) { }`不起作用。它给我一个"Debug断言失败!“消息。我所要做的就是验证数组位置是否为int,将其值更改为"n“
错误是"Debug Assertion Failed!
文件:矢量表达式:矢量下标超出范围“
然而,为什么我的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() 发布于 2012-05-01 13:04:46
向量上的operator[]()访问函数不会在越界访问时抛出异常-它只是未定义的行为。这个想法是,知道自己正在处理范围内的索引值的代码不应该为库不必要地重复检查而付出代价。
您将得到一个调试断言,因为调试库确实执行了检查,但是以您看到的断言的形式出现。由调试版本生成可在调试版本中捕获但在发布版本中不能捕获的异常是不合适的。
如果您希望进行边界检查访问,请使用vector::at(),它执行类似的访问,但会检查边界并抛出异常:
()中的成员函数提供对容器元素的边界检查访问。如果n >= a.size(),at()抛出out_of_range。
因此,您需要捕获std::out_of_range而不是int,并且需要一个#include <stdexcept>来获取它的声明。
发布于 2012-05-01 12:52:58
变量p包含的值超出了向量中元素数的范围。(它要么为负数,要么太大,或者数组为空。)断言是用来告诉你在开发过程中出了什么问题,而异常可以处理运行时的问题。我对Visual Studio不是很了解,所以我不确定他们的标准库版本是否有一个可以设置为从断言切换到异常的标志。(也许只是构建版本,不是吗?)
https://stackoverflow.com/questions/10393608
复制相似问题