Was ist das Äquivalent von neuen / Löschen von C ++ in C?
-
27-09-2019 - |
Frage
Was das Äquivalent ist neu / Löschen von C ++ in C?
Oder es ist das gleiche in C / C ++?
Lösung
Es gibt keinen new
/ delete
Ausdruck in C.
Die Äquivalente sind die malloc
und free
Funktionen , wenn Sie die Konstrukteure / Destruktoren ignorieren und Typsicherheit.
#include <stdlib.h>
int* p = malloc(sizeof(*p)); // int* p = new int;
...
free(p); // delete p;
int* a = malloc(12*sizeof(*a)); // int* a = new int[12];
...
free(a); // delete[] a;
Andere Tipps
Beachten Sie, dass Konstrukteure Ausnahmen in C ++ werfen könnte. Das Äquivalent von player* p = new player();
so etwas wie dies in C wäre.
struct player *p = malloc(sizeof *p);
if (!p) handle_out_of_memory();
int err = construct_player(p);
if (err)
{
free(p);
handle_constructor_error();
}
Das Äquivalent von delete p
ist einfacher, weil Destruktoren sollte nie „werfen“.
destruct(p);
free(p);
Verwendung von new
und delete
in C ++ kombiniert zwei Verantwortung -. Zuweisen / Freigeben dynamischen Speichers und Initialisieren / Freigeben eines Objekts
Wie alle anderen Antworten sagen, ist die häufigste Art und Weise zu verteilen und die Freigabe dynamische Speicher malloc
und free
rufen. Sie können auch OS-spezifische Funktionen verwenden, um einen großen Teil des Speichers zu erhalten und Ihre Objekte in dem zuweisen, aber das ist seltener -. Nur, wenn Sie ziemlich spezifische Anforderungen haben, dass malloc nicht erfüllt
In C, die meisten APIs werden ein Paar von Funktionen bereitzustellen, die die anderen Rollen von new
und delete
erfüllen.
Zum Beispiel verwendet die Datei api ein Paar öffnen und schließen Funktionen:
// C++
fstream* fp = new fstream("c:\\test.txt", "r");
delete fp;
// C
FILE *fp=fopen("c:\\test.txt", "r");
fclose(fp);
Es kann sein, dass fopen
Anwendungen sein malloc
den Speicher für die FILE
Struktur zuzuordnen, oder es kann statisch eine Tabelle für die maximale Anzahl der Dateizeiger auf Prozessstart zuordnen. Der Punkt ist, wird die API nicht die Client Verwendung malloc
und free
erfordern.
andere APIs Funktionen bereitzustellen, die nur die Initialisierung durchführen und Loslassen Teil des Vertrages - das entspricht den Konstruktor und destructor, die der Client-Code ermöglicht die Verwendung entweder automatisch, statische oder dynamische Speicher. Ein Beispiel ist die pThreads API:
pthread_t thread;
pthread_create( &thread, NULL, thread_function, (void*) param);
Dies ermöglicht den Kunden mehr Flexibilität, erhöht jedoch die Kopplung zwischen der Bibliothek und dem Kunden - die Kundenbedürfnisse, die Größe des pthread_t
Typs kennen, während, wenn die Bibliothek Griff sowohl Zuordnung und Initialisierung des Client nicht wissen muss, Größe des Typs, so kann die Implementierung variieren, ohne den Client überhaupt zu ändern. Weder stellt so viel Kopplung zwischen dem Client und der Implementierung als C ++ tut. (Es ist besser, oft zu denken, von C ++ als Vorlage metaprogramming Sprache mit vtables als einer OO-Sprache)
Nicht direkt eine exakte Nachbildung, aber kompatible Äquivalente sind malloc und frei.
<data-type>* variable = (<data-type> *) malloc(memory-size);
free(variable);
Nein Konstrukteuren / Destruktoren - C sowieso sie nicht hat:)
, um die Speichergröße zu erhalten, können Sie sizeof
Operator verwenden.
Wenn Sie die Arbeit mit mehrdimensionalen Arrays wollen, müssen Sie es mehrmals (wie neu) verwenden:
int** ptr_to_ptr = (int **) malloc(12 * sizeof(int *)); //assuming an array with length 12.
ptr[0] = (int *) malloc(10 * sizeof(int)); //1st element is an array of 10 items
ptr[1] = (int *) malloc(5 * sizeof(int)); //2nd element an array of 5 elements etc
Verwenden Sie malloc / free-Funktionen.