2012-10-08 42 views
0

我有這樣的代碼:的Visual Studio檢查迭代器不拋出異常

#ifdef _DEBUG 
#define _SECURE_SCL 1 
#define _SECURE_SCL_THROWS 1 
#else 
#define _SECURE_SCL 0 
#define _SECURE_SCL_THROWS 0 
#endif 

#include <iostream> 
#include <vector> 


using namespace std; 




int main() 
{ 
    vector <int> v1; 
    v1.push_back(33); 

    vector <int>::iterator it1 = v1.begin(); 

    try 
    { 
     it1++; 

     it1++; 
    } 
    catch (...) 
    { 
     cout << "vector is empty!!" << endl; 
    } 

    return 0; 
} 

一個非常簡單的一個:我試圖晃過-的邊界,我想可以捕捉到的異常。然而,程序只是崩潰與「調試斷言失敗!」在第二個增量上,爲什麼是這樣?

該示例取自http://msdn.microsoft.com/en-us/library/aa985965(v=vs.100).aspx,我剛剛添加了宏以設置選中的迭代器。我在調試模式下,/ EHSC上,所以是/ MDD

+0

我認爲您需要在爲矢量包含標題之前定義這些宏。 –

+0

@NathanMonteleone:他不應該定義這些宏。根據他所鏈接的文章,他應該使用'/ D_DEBUG/EHsc/MDd'編譯 –

+0

如果我在源代碼中定義這些宏,這不就是一樣嗎? –

回答

0

一檢查迭代器是指迭代器將拋出一個異常 或致電INVALID_PARAMETER如果試圖移過容器的邊界 。

您的示例代碼沒有移動迭代器,所以我認爲它不會引發任何事情。

+0

謝謝,但沒有解決我的問題,我改變了問題的代碼,雖然 –

+0

問題改變 –

1

你留下了最重要的部分 - #include行。

你需要把這些宏高於#include行。如果您使用預編譯頭文件,則需要將它們放入預編譯頭文件中。

由於您的問題中的代碼不完整,我無法判斷您是否做得對。我懷疑你沒有,所以我提供這個答案。

+0

問題改變 –

+0

謝謝,我試着移動它上面但沒有改變..除了編譯器告訴我「警告CRT1008 :_SECURE_SCL_THROWS已被棄用「 –

+0

@JohnnyPauling:如果你看看'#warning'行發出的消息,附近是否有一條評論暗示其他方法? –