檢查過的 Iterator

已檢查的 Iterator 能確保您的容器繫結不會被覆寫。

已檢查的 Iterator 套用釋放建置和偵錯組建。如需如何使用 Iterator 的詳細資訊,請在偵錯模式編譯,請參閱 偵錯 Iterator 支援

備註

如需如何停用是由已檢查的 Iterator 所產生之警告的詳細資訊,請參閱 _SCL_SECURE_NO_WARNINGS

您可以使用與已檢查的 Iterator 功能的下列符號。

  • _SECURE_SCL

    重要事項重要事項

    使用 _ITERATOR_DEBUG_LEVEL 控制項的 _SECURE_SCL。如需詳細資訊,請參閱_ITERATOR_DEBUG_LEVEL

    如果 _SECURE_SCL 是定義為 1,將 Iterator 的不安全的使用會導致執行階段錯誤,而且程式結束。如果已定義為 0,已檢查的 Iterator 停用。根據預設, _SECURE_SCL 的值是 0 版建置的,而 1 為偵錯組建。

_SECURE_SCL 被定義為 1 時,後續的 SCL 檢查執行:

_SECURE_SCL 被定義為 0:

  • 所有標準 Iterator 為 unchecked (Iterator 可以在容器界限之外移動,導致未定義的行為)。

  • 如果輸出 Iterator 已核取的 Iterator 會受到檢查呼叫標準函式 (例如, std::copy) 的行為。

  • 如果輸出 Iterator 是未核取的 Iterator 您在呼叫標準函式 (例如, std::copy) 的未核取的行為。

已檢查的 Iterator 參考將呼叫 invalid_parameter_handler 的 Iterator,如果您嘗試移動到容器的界限。如需 invalid_parameter_handler 的詳細資訊,請參閱 參數驗證

checked_array_iterator Classunchecked_array_iterator Class 為支援已檢查的 Iterator 的 Iterator 配接器。

範例

使用 _SECURE_SCL 1,當您編譯,執行時會發生錯誤,如果您嘗試存取使用部分類別的索引運算子,是在容器界限之外的項目。

// checked_iterators_1.cpp
// cl.exe /Zi /MDd /EHsc /W4
 
#define _ITERATOR_DEBUG_LEVEL 1
// implies #define _SECURE_SCL 1
 
#include <vector>
#include <iostream>
 
using namespace std;
 
int main() 
{
    vector<int> v;
    v.push_back(67);
 
    int i = v[0];
    cout << i << endl;
 
    i = v[1]; // triggers invalid parameter handler
};

這個程式會列印出「67 "然後快顯有其他資訊的判斷提示失敗對話方塊有關失敗。

同樣地,傳遞時,使用 _SECURE_SCL 1,您編譯,執行時會發生錯誤,如果您嘗試使用指標算術存取項目前面或某些類別,也就是說,當容器是空的。

// checked_iterators_2.cpp
// cl.exe /Zi /MDd /EHsc /W4
 
#define _ITERATOR_DEBUG_LEVEL 1
// implies #define _SECURE_SCL 1
 
#include <vector>
#include <iostream>
 
using namespace std;
 
int main() 
{
    vector<int> v;
 
    int& i = v.front(); // triggers invalid parameter handler
};

這個程式會顯示有其他資訊的判斷提示失敗對話方塊有關失敗。

請參閱

參考

標準 C++ 程式庫概觀

偵錯 Iterator 支援