Utilisez l'opérateur de suppression en C++
- 
          
            Utilisez l’opérateur deletepour libérer les ressources allouées à l’objet
- 
          
            Utilisez l’opérateur deletepour libérer des éléments dans le vecteur
 
Cet article explique plusieurs méthodes d’utilisation de l’opérateur delete en C++.
Utilisez l’opérateur delete pour libérer les ressources allouées à l’objet
    
Les objets alloués dynamiquement à l’aide de l’opérateur new doivent être libérés avant la sortie du programme, ce qui signifie que l’appelant est responsable de l’invocation explicite de l’opération delete. Notez que les initialiseurs de constructeur peuvent être utilisés pour déclarer et initialiser des objets avec l’opérateur new. L’exemple de code suivant illustre un tel scénario puis libère les ressources correspondantes avant de revenir de la fonction main. N’oubliez pas que ne pas appeler l’opérateur delete sur les objets du tas entraînera une fuite de mémoire, conduisant à une utilisation massive de la mémoire pour les processus de longue durée.
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;
int main() {
  int *num = new int(1024);
  auto *sp = new string(10, 'a');
  cout << *num << endl;
  cout << *sp << endl;
  for (const auto &item : *vp) {
    cout << item << ", ";
  }
  cout << endl;
  delete num;
  delete sp;
  return EXIT_SUCCESS;
}
Production:
1024
aaaaaaaaaa
Les opérateurs new et delete peuvent également être utilisés avec les conteneurs de bibliothèque standard. À savoir, l’objet std::vector est alloué et initialisé dans une seule instruction dans l’exemple de code suivant. Une fois que l’opérateur new retourne un pointeur sur le vector, nous pouvons y effectuer des opérations comme avec l’objet vector normal.
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
  auto *vp = new vector<int>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  for (const auto &item : *vp) {
    cout << item << ", ";
  }
  cout << endl;
  delete vp;
  return EXIT_SUCCESS;
}
Production:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
Utilisez l’opérateur delete pour libérer des éléments dans le vecteur
L’utilisation de l’opérateur delete avec des tableaux alloués dynamiquement est légèrement différente. Généralement, new et delete opèrent sur les objets un à la fois, mais les tableaux ont besoin de plusieurs éléments à allouer avec un seul appel. Ainsi, la notation entre crochets est utilisée pour spécifier le nombre d’éléments dans le tableau, comme illustré dans l’exemple de code suivant. Une allocation comme celle-ci renvoie un pointeur vers le premier élément, qui peut être déréférencé pour accéder à différents membres. Enfin, lorsque le tableau n’est pas nécessaire, il doit être libéré avec une notation spéciale delete contenant des crochets vides, ce qui garantit que chaque élément a été libéré.
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
constexpr int SIZE = 10;
constexpr int MIN = 1;
constexpr int MAX = 1000;
void initPrintIntVector(int *arr, const int &size) {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_int_distribution<int> distr(MIN, MAX);
  for (int i = 0; i < size; ++i) {
    arr[i] = distr(eng) % MAX;
    cout << setw(3) << arr[i] << "; ";
  }
  cout << endl;
}
int main() {
  int *arr1 = new int[SIZE];
  initPrintIntVector(arr1, SIZE);
  delete[] arr1;
  return EXIT_SUCCESS;
}
Production:
311; 468; 678; 688; 468; 214; 487; 619; 464; 734;
266; 320; 571; 231; 195; 873; 645; 981; 261; 243;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook