2012-05-01 74 views
0
vector <string> inputarrayconverted = { ... }; 

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

不起作用。它給了我一個「Debug Assertion Failed!」信息。所有我想要做的是檢查,如果陣列位置是一個int,其值改爲「N」如果arrayposition是一個int ...?

的誤差 「調試斷言失敗

文件:矢量 表達:向量標超出範圍「

但是,爲什麼我的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

你的問題是什麼? – user1118321

+0

爲什麼我的編譯器(VS2010)給我一個「Debug Assertion Failed!」?它似乎是完全可以接受的代碼... –

+0

當你敲斷斷言時,堆棧跟蹤是什麼樣的?哪個電話被斷言? '的atoi()'? 'c_str()'?數組賦值? – user1118321

回答

3

變量p包含的值超出了向量中元素數量的範圍。 (它可以是負數也可以是大數,或者數組是空的。)斷言是告訴你在開發過程中出了什麼問題,而異常處理運行時問題。我不太瞭解Visual Studio,所以我不確定它們的標準庫版本是否有可以設置爲從斷言切換到例外的標誌。 (也許只是建立版本嗎?)

4

operator[]()operator[]()向量上的訪問函數不會在超出邊界訪問時拋出異常 - 這只是未定義的行爲。這個想法是知道它處理的是處於邊界內的索引值的代碼,不需要爲圖書館付出代價來不必要的檢查。

你會得到一個調試斷言,因爲調試庫會執行檢查,但是以你看到的斷言的形式出現。調試版本產生一個可以在調試版本中捕獲的異常,而不是在發佈版本中是不合適的。

如果你想邊界檢查的訪問,使用vector::at()執行類似的訪問,但邊界檢查和將引發異常:

在()成員函數提供了容器 邊界檢查訪問元素。如果n> = a.size(),則at()會拋出out_of_range。

所以,你想趕上std::out_of_range而不是int,你會需要一個#include <stdexcept>得到聲明它。

相關問題