0

私はこのコードを持っています:

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

非常に単純なものです。境界を越えようとし、例外をキャッチしたいと思います。ただし、プログラムは単に「デバッグアサーションに失敗しました!」とクラッシュします。2番目の増分で、それはなぜですか?

この例はhttp://msdn.microsoft.com/en-us/library/aa985965(v=vs.100).aspxから取得したもので、チェックしたイテレーターをオンに設定するためのマクロを追加しました。私はデバッグモードで、/ EHscがオンになっていて、/MDdもオンになっています

4

3 に答える 3

1

Visual C ++のライブラリの新しいバージョン(Visual Studio 2010にバンドルされている)は、チェックされたイテレーターからの例外のスローをサポートしていません。http://wishmesh.com/2010/04/it-seems-that-_secure_scl_throws-is-deprecated-in-visual-studio-c-2010/を参照してください

于 2012-10-08T18:40:57.823 に答える
1

あなたはあなたの質問から最も重要な部分、つまり#include線を残しました。

これらのマクロを#include行の上に配置する必要があります。プリコンパイル済みヘッダーを使用している場合は、それらをプリコンパイル済みヘッダーに配置する必要があります。

あなたの質問のコードは完全ではないので、あなたがこれを正しく行ったかどうかはわかりません。あなたがそうしていないのではないかと思うので、私はこれを答えとして提供します。

于 2012-10-08T18:23:10.040 に答える
0

チェックされたイテレータは、コンテナの境界を越えて移動しようとすると、例外をスローするか、invalid_parameterを呼び出すイテレータを指します。

あなたのサンプルコードはイテレータを動かしていないので、何かがスローされることは意味がないと思います。

于 2012-10-08T17:56:13.563 に答える