make_checked_array_iterator
Crée un checked_array_iterator qui peut être utilisé par d'autres algorithmes.
Notes
Cette fonction est une extension Microsoft de la bibliothèque C++ standard.Le code implémenté à l'aide de cette fonction ne peut pas être utilisé dans les environnements de build C++ standard qui ne prennent pas en charge cette extension Microsoft.
template <class Iter>
checked_array_iterator<Iter>
make_checked_array_iterator(
Iter Ptr,
size_t Size,
size_t Index = 0
);
Paramètres
Ptr
Pointeur vers le tableau de destination.Size
Taille du tableau de destination.Index
Index facultatif du tableau.
Valeur de retour
Instance de checked_array_iterator.
Notes
La fonction make_checked_array_iterator est définie dans l'espace de noms stdext.
Cette fonction accepte un pointeur brut (qui cause habituellement un problème de débordement de limites) et l'inclut dans une classe checked_array_iterator qui effectue une vérification. La classe étant marquée comme vérifiée, la bibliothèque STL n'affiche pas d'avertissement. Pour plus d'informations et d'exemples de code, consultez Itérateurs vérifiés.
Exemple
Dans l'exemple suivant, un vecteur est créé et rempli avec 10 éléments. Le contenu du vecteur est copié dans un tableau à l'aide de l'algorithme de copie, puis make_checked_array_iterator est utilisé pour spécifier la destination. Ceci est suivi d'une violation intentionnelle de la vérification des limites, afin de déclencher un échec d'assertion de débogage.
// 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));
}
Sortie
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
Configuration requise
En-tête : <iterator>
Espace de noms : stdext