Verwendung des delete-Operators in C++
-
Verwenden des
delete
-Operators zum Freigeben der allozierten Ressourcen für das Objekt -
Verwenden des
delete
-Operators zum Freigeben von Elementen im Vektor
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;
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