Utilisez l'opérateur de suppression en C++
-
Utilisez l’opérateur
delete
pour libérer les ressources allouées à l’objet -
Utilisez l’opérateur
delete
pour 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