Was ist die Verwendung von malloc
und free
, wenn wir new
und delete
in C++ haben. Ich denke, die Funktion von free
und delete
ist gleich.Warum malloc/free verwenden, wenn wir neue/löschen?
Antwort
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 malloc
new
und delete
, verwenden soll und free
sind aus Gründen der Kompatibilität mit C. dort
Okk. aber beide werden für die Speicherverwaltung verwendet. Wann also neu und wann malloc verwenden? – Parag
@Parag Nicht "In C++, Sie sollen neue und löschen verwenden" beantworten Sie das? Verwenden Sie nicht malloc/free. – hvd
@ 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). –
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ährendmalloc
nicht der Fall, würde man eine zusätzlichememset
oder verwandte Funktionsaufrufe zu tun haben, einemalloc
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üfenNULL
nach, nur Ausnahme umschließenden Handler wird die Arbeit machen Sie redundante Fehler im Gegensatz zumalloc
Überprüfung zu speichern.
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
@ hvd: 'neue char []' hat einige (sehr kleine) Overhead. Es speichert nämlich die Anzahl von Zeichen, die in dem Speicherblock zugewiesen sind. –
@NicolBolas: Und wie kann "frei" wissen, wie viel zu befreien? 'malloc' speichert auch die Anzahl der zugewiesenen Bytes. – MSalters
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()
.)
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. –
@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). –
- 1. Warum verwenden wir pthread_exit(), wenn wir return verwenden können?
- 2. Warum CJSON verwenden, wenn wir json_encode
- 3. Warum verwenden wir Cookies in Asp.net, wenn wir Sitzungen haben?
- 4. Warum verwenden wir Serialisierung?
- 5. Warum verwenden wir setLayoutParams?
- 6. Warum verwenden wir HTTP?
- 7. Warum verwenden wir web.xml?
- 8. Warum * sollten * Wir verwenden EventHandler
- 9. Warum verwenden wir extra Ausdruck?
- 10. Warum sollten wir lua_pushinteger() verwenden?
- 11. Warum verwenden wir innere Klassen?
- 12. Warum verwenden wir Formatbezeichner python
- 13. Warum genau verwenden wir NoSQL?
- 14. Warum verwenden wir Überlauf: versteckt;
- 15. Warum verwenden wir den TaskStackBuilder?
- 16. Angular 2 - warum müssen wir ngForm verwenden, wenn wir benutzerdefinierte Validierung verwenden?
- 17. C#: Warum verwenden Generika nicht den allgemeinsten Typ, den wir verwenden können, wenn wir keinen angeben?
- 18. Warum verwenden wir abroll segue, wenn wir Segmente verwenden können, um zu einem View-Controller zurückzukehren?
- 19. Warum müssen wir verwenden, außer und "?" zusammen statt, wenn allein
- 20. Warum verwenden wir #includes, wenn Vorwärtsdeklarationen überlegen zu sein scheinen?
- 21. Wenn, wenn überhaupt, sollten wir const verwenden?
- 22. Warum wir analyse_export brauchen, wenn wir haben analyse_port
- 23. Warum verwenden wir canvas.save oder canvas.restore?
- 24. Warum verwenden wir @Embeddable In Hibernate
- 25. Warum brauchen wir JWT, wenn wir Clientsitzungen haben?
- 26. Warum verwenden wir Radiant beim Programmieren?
- 27. Warum verwenden wir "neu" in pimpl?
- 28. Android - Warum sollten wir adapter.notifydatasetChanged() Methode verwenden?
- 29. Sollten wir Integer strikt verwenden, wenn wir Steuerelemente in iOS Layout? Warum?
- 30. Warum dürfen wir const mit Referenztypen verwenden, wenn wir ihnen nur null zuweisen?
Es zuverwendende C ... – Mysticial