Überprüfte Iteratoren

Überprüfte Iteratoren sicherstellen, dass die Grenzen des Containers nicht überschrieben werden.

Überprüfte Iteratoren gelten für Releasebuilds und Debugbuilds zu.Weitere Informationen dazu, wie Iteratoren, wenn Sie im Debugmodus kompilieren, finden Sie unter Debug- Iteratorunterstützung verwendet.

Hinweise

Informationen darüber, wie Sie Warnungen, die durch überprüfte Iteratoren generiert werden, finden Sie unter _SCL_SECURE_NO_WARNINGS deaktiviert.

Sie können das folgende Symbol mit der überprüften Iteratorfunktion verwenden.

  • _SECURE_SCL

    Wichtiger HinweisWichtig

    Verwendung _ITERATOR_DEBUG_LEVEL, _SECURE_SCL zu steuern.Weitere Informationen finden Sie unter _ITERATOR_DEBUG_LEVEL.

    Wenn _SECURE_SCL als 1 definiert ist, verursacht unsichere Verwendung von Iteratoren einen Laufzeitfehler und das Programm wird beendet.Wenn sie als 0 definiert sind, werden überprüfte Iteratoren deaktiviert.Standardmäßig ist der Wert für _SECURE_SCL 0 für Releasebuilds und 1 für Debugbuilds.

Wenn _SECURE_SCL als 1 definiert ist, werden folgenden SCL-Überprüfungen ausgeführt:

Wenn _SECURE_SCL als 0 definiert wird:

  • Alle Standarditeratoren werden deaktiviert (Iteratoren können über den Containergrenzen hinaus bewegt, das undefiniertes Verhalten führt).

  • Wenn ein Ausgabeiterator ein überprüfter Iterator ist, werden Sie Verhalten bei Aufrufen der Standardfunktion überprüft (beispielsweise, std::copy).

  • Wenn ein Ausgabeiterator ein deaktivierter Iterator ist, erhalten Sie deaktiviertes Verhalten auf Aufrufe an die Standardfunktion (beispielsweise, std::copy).

Ein überprüfter Iterator ist ein Iterator an, der invalid_parameter_handler aufruft, wenn Sie versuchen, über die Grenzen des Containers zu wechseln.Weitere Informationen zu invalid_parameter_handler finden Sie unter Parametervalidierung.

checked_array_iterator Class und unchecked_array_iterator Class sind die Iteratoradapter, die überprüfte Iteratoren unterstützen.

Beispiel

Wenn Sie kompilieren, indem Sie _SECURE_SCL 1 verwenden, tritt ein Laufzeitfehler auf, wenn Sie versuchen, auf ein Element zuzugreifen, die außerhalb der Grenzen des Containers ist, indem Sie den Indizierungsoperator bestimmter Klassen verwendet.

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

Dieses Programm gibt "67 " bringen dann ein Assertionsfehlerdialogfeld mit zusätzlichen Informationen über den Fehler aus.

Auch wenn Sie kompilieren, indem Sie _SECURE_SCL 1 verwenden, tritt ein Laufzeitfehler auf, wenn Sie versuchen, auf ein Element zuzugreifen, indem Sie Vordergrund- oder Rückseite eines bestimmten Klassen verwenden, wenn der Container leer ist.

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

Dieses Programm wird nach einem Assertionsfehlerdialogfeld mit zusätzlichen Informationen zum Fehler.

Siehe auch

Referenz

C++-Standardbibliothek-Übersicht

Debug- Iteratorunterstützung