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