Usa l'operatore di eliminazione in C++
-
Usa l’operatore
delete
per liberare le risorse allocate per l’oggetto -
Usa l’operatore
delete
per liberare elementi in Vector
Questo articolo spiegherà diversi metodi su come utilizzare l’operatore delete
in C++.
Usa l’operatore delete
per liberare le risorse allocate per l’oggetto
Gli oggetti allocati dinamicamente usando l’operatore new
dovrebbero essere liberati prima dell’uscita del programma, il che significa che il chiamante è responsabile di invocare esplicitamente l’operazione delete
. Si noti che gli inizializzatori del costruttore possono essere utilizzati per dichiarare e inizializzare gli oggetti con l’operatore new
. Il codice di esempio seguente mostra un tale scenario e quindi libera le risorse corrispondenti prima di tornare dalla funzione main
. Ricorda che non chiamare l’operatore delete
sugli oggetti heap provocherà una perdita di memoria, portando a un utilizzo massiccio della memoria per i processi a lunga esecuzione.
#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;
}
Produzione:
1024
aaaaaaaaaa
Gli operatori new
e delete
possono essere usati anche con contenitori di librerie standard. Vale a dire, l’oggetto std::vector
viene allocato e inizializzato in una singola istruzione nel seguente codice di esempio. Una volta che l’operatore new
restituisce un puntatore al vector
, possiamo eseguire operazioni su di esso come con il normale oggetto vector
.
#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;
}
Produzione:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
Usa l’operatore delete
per liberare elementi in Vector
L’uso dell’operatore delete
con array allocati dinamicamente è leggermente diverso. In genere, new
e delete
operano sugli oggetti uno alla volta, ma gli array richiedono che più elementi siano allocati con una chiamata. Pertanto, la notazione delle parentesi quadre viene utilizzata per specificare il numero di elementi nella matrice, come dimostrato nel seguente codice di esempio. Un’allocazione come questa restituisce un puntatore al primo elemento, che può essere dereferenziato per accedere a membri diversi. Infine, quando l’array non è necessario, dovrebbe essere liberato con una speciale notazione delete
contenente parentesi quadre vuote, che garantisce che ogni elemento sia stato deallocato.
#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;
}
Produzione:
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