Verwendung des delete-Operators in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden des delete-Operators zum Freigeben der allozierten Ressourcen für das Objekt
  2. Verwenden des delete-Operators zum Freigeben von Elementen im Vektor
Verwendung des delete-Operators in C++

In diesem Artikel werden verschiedene Methoden zur Verwendung des Operators delete in C++ erläutert.

Verwenden des delete-Operators zum Freigeben der allozierten Ressourcen für das Objekt

Dynamisch zugewiesene Objekte, die den Operator new verwenden, sollten vor dem Beenden des Programms freigegeben werden. Dies bedeutet, dass der Aufrufer dafür verantwortlich ist, die Operation delete explizit aufzurufen. Beachten Sie, dass Konstruktorinitialisierer verwendet werden können, um Objekte mit dem Operator new zu deklarieren und zu initialisieren. Der folgende Beispielcode demonstriert ein solches Szenario und gibt dann die entsprechenden Ressourcen frei, bevor Sie von der Funktion main zurückkehren. Beachten Sie, dass das Nichtaufrufen des Operators delete für die Heap-Objekte zu einem Speicherverlust führt, der zu einer massiven Speichernutzung für die lang laufenden Prozesse führt.

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

Ausgabe:

1024
aaaaaaaaaa

Die Operatoren new und delete können auch mit Containern der Standardbibliothek verwendet werden. Im folgenden Beispielcode wird nämlich das Objekt std::vector in einer einzigen Anweisung alloziert und initialisiert. Sobald der new-Operator einen Zeiger auf den Vektor zurückgibt, können wir darauf Operationen wie mit dem regulären Vektor-Objekt durchführen.

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

Ausgabe:

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

Verwenden des delete-Operators zum Freigeben von Elementen im Vektor

Die Verwendung des Operators delete mit dynamisch zugewiesenen Arrays unterscheidet sich geringfügig. Im Allgemeinen operieren new und delete auf ein Objekt nach dem anderen, aber bei Arrays müssen mehrere Elemente mit einem Aufruf zugewiesen werden. Daher wird die Notation mit eckigen Klammern verwendet, um die Anzahl der Elemente im Array anzugeben, wie im folgenden Beispielcode gezeigt. Eine solche Zuweisung liefert einen Zeiger auf das erste Element, der dereferenziert werden kann, um auf andere Mitglieder zuzugreifen. Wenn das Array nicht mehr benötigt wird, sollte es schließlich mit einer speziellen delete-Schreibweise mit leeren eckigen Klammern freigegeben werden, die garantiert, dass jedes Element freigegeben wurde.

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

Ausgabe:

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

Verwandter Artikel - C++ Memory