Usa l'operatore di eliminazione in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’operatore delete per liberare le risorse allocate per l’oggetto
  2. Usa l’operatore delete per liberare elementi in Vector
Usa l'operatore di eliminazione in C++

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;
Autore: 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

Articolo correlato - C++ Memory