檢查過的 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 檢查執行:
所有標準 Iterator (例如, vector::iterator) 已核取。
如果輸出 Iterator 已核取的 Iterator 會受到檢查呼叫標準函式 (例如, std::copy) 的行為。
如果輸出 Iterator 是未核取的 Iterator 呼叫標準函式將會產生編譯器警告。
下列函式會產生執行階段錯誤,則是在容器的界限之外的存取:
當 _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 Class 和 unchecked_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
};
這個程式會顯示有其他資訊的判斷提示失敗對話方塊有關失敗。