Frage

Was das Äquivalent ist neu / Löschen von C ++ in C?

Oder es ist das gleiche in C / C ++?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top