Utilisez l'opérateur de suppression en C++

Jinku Hu 12 octobre 2023
  1. Utilisez l’opérateur delete pour libérer les ressources allouées à l’objet
  2. Utilisez l’opérateur delete pour libérer des éléments dans le vecteur
Utilisez l'opérateur de suppression en C++

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;
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ Memory