Destruktor für dynamisches Array in C++

Namita Chaudhary 12 Oktober 2023
  1. Destruktor für dynamisches Array in C++
  2. Notwendigkeit für Destruktor in C++
  3. Beispiele für Destruktor in C++
  4. Dynamisches Array mit Destruktor in C++ löschen
  5. Abschluss
Destruktor für dynamisches Array in C++

Beim Programmieren in einer beliebigen Programmiersprache hören wir oft von Konstruktoren und Destruktoren. Konstruktoren sind spezielle Elementfunktionen, die zum Initialisieren des Objekts einer Klasse verwendet werden, während Destruktoren ebenfalls spezielle Funktionen sind, die automatisch aufgerufen werden, wenn ein Objekt zerstört wird.

In diesem Artikel wird der Destruktor für dynamische Arrays in C++ ausführlich behandelt.

Destruktor für dynamisches Array in C++

Destruktoren sind spezielle Elementfunktionen, die denselben Namen wie die Klasse haben und automatisch aufgerufen werden, wenn ein Objekt zerstört werden soll.

Die Destruktorfunktion ist die letzte Funktion, die aufgerufen wird, wenn ein Objekt zerstört wird. Es bereinigt den Speicher, den die vom Konstruktor erstellten Objekte belegen.

Sowohl der Konstruktor als auch der Destruktor haben jedoch denselben Namen wie die Klasse, aber es gibt einen Unterschied zwischen den beiden in Bezug darauf, wie sie geschrieben sind, damit der Compiler sie unterscheiden kann. Die Destruktoren werden mit einem Negationszeichen (~) gefolgt vom Klassennamen geschrieben, die Konstruktoren nur mit dem Klassennamen.

Außerdem kann es für eine Klasse nur einen einzigen Destruktor geben, aber die Konstruktoren können mehrere sein.

Immer wenn ein Objekt in C++ erstellt wird, belegt es Speicher im Heap-Abschnitt, und wir verwenden das Schlüsselwort new, um dieses Objekt der Klasse dynamisch zu erstellen. Ebenso wird das Schlüsselwort delete verwendet, um das dynamisch erstellte Objekt der Klasse zu löschen.

Notwendigkeit für Destruktor in C++

Wir müssen das Objekt löschen, um Speicherverluste zu vermeiden. Ein Speicherleck tritt auf, wenn die Programmierer vergessen, den Speicher im Heap zu löschen, der nicht verwendet wird. Aus diesem Grund verringert sich die Leistung des Computers, da die Menge an verfügbarem Arbeitsspeicher reduziert wird.

Außerdem stürzt das Programm zur Laufzeit ab, wenn die Objekte nicht explizit mit den Destruktoren gelöscht werden.

Beispiele für Destruktor in C++

Sehen wir uns nun einige Beispiele an, wie das Objekt einer Klasse mit dem Operator delete gelöscht werden kann.

Beispiel 1:

Im ersten Beispiel erstellen wir das Objekt einer Klasse dynamisch mit dem Operator new und löschen es explizit mit dem Schlüsselwort delete in C++.

Unten ist das Codebeispiel, das den delete-Operator in C++ verwendet.

#include <iostream>
using namespace std;

class Employee {
 public:
  Employee() { cout << "Constructor of Employee class was called!\n"; }
  ~Employee() { cout << "Destructor of Employee class was called!\n"; }
  void work() { cout << "Still Working!\n"; }
};
int main() {
  Employee* emp = new Employee();
  emp->work();
  delete emp;

  return 0;
}

Ausgang:

Constructor of Employee class was called!
Still Working!
Destructor of Employee class was called!

Im obigen Beispiel haben wir eine Klasse Employee mit einem Konstruktor, einem Destruktor und einer work-Funktion erstellt, die die entsprechende Nachricht über ihre Aktionen enthält.

In der Funktion main haben wir mit dem Schlüsselwort new das Objekt der Klasse emp erzeugt und damit die Funktion work() aufgerufen. Danach haben wir einfach den Operator delete und den Objektnamen emp verwendet, um dasselbe zu löschen.

Dynamisches Array mit Destruktor in C++ löschen

Bisher haben wir gesehen, wie man ein einzelnes Objekt einer Klasse mit dem Schlüsselwort delete in C++ löscht. Lassen Sie uns nun sehen, wie man ein dynamisches Array oder ein Array von Objekten in C++ löscht.

In diesem Beispiel erstellen wir ein dynamisches Array in C++ mit dem Schlüsselwort new und löschen es dann mit dem Operator delete.

Beachten Sie jedoch beim Löschen eines dynamischen Arrays in C++, dass wir dafür den Operator delete [] verwenden müssen und nicht nur delete. Daher wird der Operator delete verwendet, um ein einzelnes Objekt einer Klasse zu löschen, während wir zum Löschen eines dynamischen Arrays oder eines Arrays von Objekten den Operator delete [] in C++ verwenden müssen.

Lassen Sie es uns nun anhand eines Codebeispiels verstehen.

#include <iostream>
using namespace std;
class Employee {
 public:
  Employee() { cout << "Constructor of Employee class was called!\n"; }
  ~Employee() { cout << "Destructor of Employee class was called!\n"; }
  void work() { cout << "Still working!\n"; }
};
int main() {
  Employee* emp = new Employee[3];
  emp[0].work();
  emp[1].work();
  emp[2].work();

  delete[] emp;

  return 0;
}

Ausgang:

Constructor of Employee class was called!
Constructor of Employee class was called!
Constructor of Employee class was called!
Still working!
Still working!
Still working!
Destructor of Employee class was called!
Destructor of Employee class was called!
Destructor of Employee class was called!

In diesem Codebeispiel haben wir einen ähnlichen Code wie im vorherigen Beispiel, aber dieses Mal haben wir drei Employee-Objekte erstellt und sie mit dem delete []-Operator in C++ gelöscht.

Wenn wir jedoch statt delete [] den delete-Operator verwenden, stürzt das Programm zur Laufzeit ab. Sehen wir uns dazu auch ein Beispiel an, um das Löschen des dynamischen Arrays in C++ besser zu verstehen.

#include <iostream>
using namespace std;
class Employee {
 public:
  Employee() { cout << "Constructor of Employee class was called!\n"; }
  ~Employee() { cout << "Destructor of Employee class was called!\n"; }
  void work() { cout << "Still working!\n"; }
};
int main() {
  Employee* emp = new Employee[3];
  emp[0].work();
  emp[1].work();
  emp[2].work();

  delete emp;

  return 0;
}

Ausgang:

Error in `./example1.cpp': munmap_chunk(): invalid pointer: 0x000000000117f018 ***
timeout: the monitored command dumped core
/bin/bash: line 1:    33 Aborted                 timeout 15s ./0f6c05b9-ee09-44c3-acee-8ad8a882ac5e < 0f6c05b9-ee09-44c3-acee-8ad8a882ac5e.in

Constructor of Employee class was called!
Constructor of Employee class was called!
Constructor of Employee class was called!
Still working!
Still working!
Still working!
Destructor of Employee class was called!

Wie Sie in der obigen Ausgabe sehen können, wurden daher die Konstruktoren und die Funktion work für alle drei Objekte aufgerufen, aber der Destruktor wurde nur einmal für ein einziges Objekt aufgerufen, wonach das Programm abstürzte.

Abschluss

In diesem Artikel haben wir den Destruktor für dynamische Arrays in C++ besprochen. Die Destruktoren sind spezielle Elementfunktionen, die automatisch aufgerufen werden, wenn ein Objekt gelöscht werden soll.

Wir verwenden den Operator delete, um ein Objekt einer Klasse zu löschen; es löscht jedoch nur ein einzelnes Objekt einer Klasse. Um ein dynamisches Array oder ein Array von Objekten zu löschen, verwenden wir den Operator delete [].

Sowohl die Operatoren als auch ihre Verwendung wurden in diesem Artikel anhand geeigneter Beispiele erläutert.

Verwandter Artikel - C++ Array

Verwandter Artikel - C++ Destructor