Utilizar el operador delete en C++

Jinku Hu 12 octubre 2023
  1. Utilice el operador delete para liberar los recursos asignados para el objeto
  2. Utilice el operador delete para liberar elementos en Vector
Utilizar el operador delete en C++

Este artículo explicará varios métodos de cómo utilizar el operador delete en C++.

Utilice el operador delete para liberar los recursos asignados para el objeto

Los objetos asignados dinámicamente que utilizan el operador new deben liberarse antes de la salida del programa, lo que significa que el llamador es responsable de invocar explícitamente la operación de delete. Observe que los inicializadores del constructor se pueden utilizar para declarar e inicializar objetos con el operador new. El siguiente código de ejemplo demuestra tal escenario y luego libera los recursos correspondientes antes de regresar de la función main. Tenga en cuenta que no llamar al operador delete en los objetos del montón resultará en una pérdida de memoria, lo que llevará a un uso masivo de memoria para los procesos de larga ejecución.

#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;
}

Producción :

1024
aaaaaaaaaa

Los operadores new y delete también se pueden usar con contenedores de biblioteca estándar. Es decir, el objeto std::vector se asigna e inicializa en una sola declaración en el siguiente código de ejemplo. Una vez que el operador new devuelve un puntero al vector, podemos realizar operaciones en él como con el objeto 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;
}

Producción :

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

Utilice el operador delete para liberar elementos en Vector

El uso del operador delete con matrices asignadas dinámicamente es ligeramente diferente. Generalmente, new y delete operan en los objetos uno a la vez, pero los arrays necesitan que se asignen varios elementos con una llamada. Por lo tanto, la notación entre corchetes se utiliza para especificar el número de elementos en el array, como se demuestra en el siguiente código de ejemplo. Una asignación como esta devuelve un puntero al primer elemento, que puede desreferenciarse para acceder a diferentes miembros. Finalmente, cuando el array no es necesaria, debe liberarse con una notación especial delete que contiene corchetes vacíos, lo que garantiza que cada elemento ha sido desasignado.

#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;
}

Producción :

311; 468; 678; 688; 468; 214; 487; 619; 464; 734;
266; 320; 571; 231; 195; 873; 645; 981; 261; 243;
Autor: 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

Artículo relacionado - C++ Memory