Visual Studio检查迭代器而不是抛出异常

时间:2012-10-08 17:04:18

标签: c++ visual-studio-2010 visual-studio iterator

我有这段代码:

#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;
}

一个非常简单的问题:我试图超越边界,我想要捕获异常。但是程序只是因为“Debug Assertion Failed!”而崩溃了。在第二个增量,为什么?

该示例取自http://msdn.microsoft.com/en-us/library/aa985965(v=vs.100).aspx,我刚刚添加了宏来设置已检查的迭代器。我处于调试模式,/ EHsc打开,因此是/ MDd

3 个答案:

答案 0 :(得分:1)

您离开了问题中最重要的部分 - #include行。

您需要将这些宏放在#include行之上。如果您正在使用预编译头文件,则需要将它们放在预编译头文件中。

因为你问题中的代码不完整,我不知道你是否做得对。我怀疑你没有,所以我提供这个答案。

答案 1 :(得分:1)

新版本的Visual C ++库(在Visual Studio 2010中捆绑)不支持从已检查的迭代器中抛出异常。见http://wishmesh.com/2010/04/it-seems-that-_secure_scl_throws-is-deprecated-in-visual-studio-c-2010/

答案 2 :(得分:0)

  

检查的迭代器引用将抛出异常的迭代器   如果您试图越过边界,请调用invalid_parameter   容器。

你的示例代码没有移动迭代器,所以我认为不会抛出任何东西是有道理的。