Freigeben über


make_checked_array_iterator

Erstellt ein checked_array_iterator-Objekt, das von anderen Algorithmen verwendet werden kann.

Hinweis

Bei dieser Funktion handelt es sich um eine Microsoft-Erweiterung der C++-Standardbibliothek.Der Code, der mit dieser Funktion implementiert wird, ist nicht auf C++-Standardbuildumgebungen übertragbar, die die Microsoft-Erweiterung nicht unterstützen.

template <class Iter>
  checked_array_iterator<Iter> 
    make_checked_array_iterator(
      Iter Ptr,
      size_t Size,
      size_t Index = 0
);

Parameter

  • Ptr
    Ein Zeiger auf das Zielarray.

  • Size
    Die Größe des Zielarrays.

  • Index
    Optionaler Index im Array.

Rückgabewert

Eine Instanz von checked_array_iterator.

Hinweise

Die make_checked_array_iterator-Funktion wird im stdext-Namespace definiert.

Diese Funktion akzeptiert einen unformatierten Zeiger – was normalerweise problematisch wäre im Hinblick auf eine Überschreitung der Begrenzungen – und umschließt ihn in einer checked_array_iterator-Klasse, die die Überprüfung ausführt. Da diese Klasse als überprüft markiert ist, gibt STL hierzu keine Warnung aus. Weitere Informationen und Codebeispiele finden Sie unter Überprüfte Iteratoren.

Beispiel

Im folgenden Beispiel wird vector erstellt und mit 10 Elementen gefüllt. Der Inhalt des Vektors wird mithilfe des Kopieralgorithmus in ein Array kopiert. Anschließend wird make_checked_array_iterator verwendet, um das Ziel anzugeben. Daraufhin erfolgt eine absichtliche Verletzung der Begrenzungen bei der Überprüfung, sodass eine Debugassertionsfehler ausgelöst wird.

// make_checked_array_iterator.cpp
// compile with: /EHsc /W4 /MTd

#include <algorithm>
#include <iterator> // stdext::make_checked_array_iterator
#include <memory> // std::make_unique
#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }

    cout << endl;
}

int main()
{
    const size_t dest_size = 10;
    // Old-school but not exception safe, favor make_unique<int[]>
    // int* dest = new int[dest_size];
    unique_ptr<int[]> updest = make_unique<int[]>(dest_size);
    int* dest = updest.get(); // get a raw pointer for the demo

    vector<int> v;

    for (int i = 0; i < dest_size; ++i) {
        v.push_back(i);
    }
    print("vector v: ", v);

    copy(v.begin(), v.end(), stdext::make_checked_array_iterator(dest, dest_size));

    cout << "int array dest: ";
    for (int i = 0; i < dest_size; ++i) {
        cout << dest[i] << " ";
    }
    cout << endl;

    // Add another element to the vector to force an overrun.
    v.push_back(10);
    // The next line causes a debug assertion when it executes.
    copy(v.begin(), v.end(), stdext::make_checked_array_iterator(dest, dest_size));
}

Ausgabe

vector v: 0 1 2 3 4 5 6 7 8 9
int array dest: 0 1 2 3 4 5 6 7 8 9

Anforderungen

Header: <Iterator>

Namespace: stdext

Siehe auch

Referenz

Standardvorlagenbibliothek