2012-04-02 9 views

Antwort

8

Sie sind nicht das Gleiche. new ruft den Konstruktor auf, malloc reserviert nur den Speicher.

Außerdem ist es undefiniertes Verhalten die zwei (das heißt unter Verwendung von new mit free und malloc mit delete) Mischen.

In C++, sind Sie mallocnew und delete, verwenden soll und free sind aus Gründen der Kompatibilität mit C. dort

+0

Okk. aber beide werden für die Speicherverwaltung verwendet. Wann also neu und wann malloc verwenden? – Parag

+4

@Parag Nicht "In C++, Sie sollen neue und löschen verwenden" beantworten Sie das? Verwenden Sie nicht malloc/free. – hvd

+0

@ hvd: Das ist nicht der richtige Rat. Ihr Grundprinzip, nur 'new' und' delete' in C++ zu verwenden, ist nicht ganz korrekt (besonders nach Nicols Antwort auf Ihren Kommentar). –

5

In C++ ist es selten sinnvoll, dass ein malloc & free statt new & verwenden würden, delete.

Ein Szenario kann ich denken ist:

Wenn Sie möchten Ihr Gedächtnis durch implizite Konstruktoraufrufe initialisiert nicht erhalten, und müssen nur eine sichere Speicherzuweisung für placement new dann ist es völlig in Ordnung malloc zu verwenden und free anstelle von new und delete. Auf der anderen Seite ist es wichtig zu wissen, dass malloc und new nicht identisch sind!
Zwei wichtige Unterschiede gerade nach oben sind:

  • new Garantien callng von Konstrukteuren Ihrer Klasse zur Initialisierung der Klassenmitglieder während malloc nicht der Fall, würde man eine zusätzliche memset oder verwandte Funktionsaufrufe zu tun haben, eine malloc schreiben um den zugewiesenen Speicher zu initialisieren, um etwas Sinnvolles zu tun.

  • Ein großer Vorteil ist, dass für new Sie müssen jede Zuordnung nicht überprüfen NULL nach, nur Ausnahme umschließenden Handler wird die Arbeit machen Sie redundante Fehler im Gegensatz zu malloc Überprüfung zu speichern.

+0

Sicher, aber ein expliziter Aufruf von 'operator new' reicht dafür aus, oder' new char [n] '. (Nichts ist falsch mit malloc dafür, aber es ist nicht notwendig.) – hvd

+2

@ hvd: 'neue char []' hat einige (sehr kleine) Overhead. Es speichert nämlich die Anzahl von Zeichen, die in dem Speicherblock zugewiesen sind. –

+0

@NicolBolas: Und wie kann "frei" wissen, wie viel zu befreien? 'malloc' speichert auch die Anzahl der zugewiesenen Bytes. – MSalters

3

Erstens, wenn Sie sprechen von new und delete, ich nehme an, Sie meinen die Ausdrücke und nicht die operator new und operator delete Funktionen. Die Ausdrücke new und delete sind nicht auf malloc und free bezogen und verwalten nur den Speicher zufällig; ihre Hauptrolle ist Objektlebensdauer verwalten: ein new Ausdruck wird die operator new Funktion aufrufen, um Speicher zu erhalten, und rufen Sie dann den Konstruktor; Ein delete Ausdruck wird den Destruktor aufrufen, bevor der Aufruf operator delete zu den Speicher freigibt.In den meisten Fällen sollten Objekte und nicht einfach zugewiesen erstellt werden, was bedeutet, die Ausdrücke ausschließlich zu verwenden.

Es gibt einige seltene Fälle, wo man Zuteilung und Initialisierung (Schaffung) trennen möchte; Implementieren von Dingen wie std::vector ist ein klassisches Beispiel, wo Sie für viele Objekte auf einmal vergeben, aber nur eins nach dem anderen konstruieren. In solchen Fällen verwenden Sie die Funktion operator new für die Zuweisung und die Platzierung neu für die Initialisierung. unter das andere Ende, rufen Sie explizit den Konstruktor (etwas wie p->~T()) für die Zerstörung, und verwenden Sie die Funktion zu den Speicher frei.

Aus der Hand, kann ich nur an zwei Fälle denken, wo Sie malloc und free in C++ verwenden würden. Die erste besteht darin, eigene Ersetzungen der Funktionen ::operator new und ::operator delete zu implementieren. (I ersetzen oft die globale ::operator new und ::operator delete mit Debugging Versionen, die Trace-Zuweisungen, setzen Schutzzonen rund um den zugewiesenen Speicher usw.) Das andere ist, wenn sie mit einem Legacy-Bibliothek geschrieben in C interagiert: wenn die Bibliothek sagt passieren ein Zeiger auf Speicher von malloc zugewiesen (weil sie es selbst free mit befreien) oder mehr häufig, einen Zeiger auf Speicher von malloc zugewiesen zurückgibt, die Sie erwartet sind zu befreien, dann müssen Sie verwenden malloc und free . (Die bessere Bibliotheken werden ihre eigene Zuordnung und Aufhebung der Zuordnung Funktionen zur Verfügung stellen, die tun mehr oder weniger, was die new und delete Betreiber tun, aber es wird immer Dinge wie strdup().)

+0

Für diejenigen, die an der ersten Verwendung in der Antwort angegeben interessiert sind, [Wie sollte ich schreiben ISO C++ Standard konforme benutzerdefinierte neue und löschende Betreiber?] (Http://stackoverflow.com/ Fragen/7194127/How-sollte-ich-schreibe-ISO-C-Standard-konforme-benutzerdefinierte-neue-und-löschen-Operatoren) ist eine gute Lese. –

+0

@Als Für 100% ige Übereinstimmung können Sie die Sprache 'malloc' und' free' verwenden und sonst nichts. Realistisch gesehen gibt es eine Menge Funktionen, die einfach niemals Speicher zuweisen (wie 'memset'); Ich würde sie auch als sicher betrachten. Praktisch, Sie sind wahrscheinlich sicher mit der gesamten C-Bibliothek, aber meine Debugging-Implementierungen überprüfen die Rekursion und verwenden nicht mehr als ein 'malloc',' memset' und 'memcpy', wenn' :: operator new' aufgerufen wird rekursiv (wenn 'fprintf' also' :: operator new' verwendet, würde ich nicht mit unendlicher Rekursion enden). –

Verwandte Themen