Partager via


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

Voir aussi

Référence

Bibliothèque STL (Standard Template Library)