597 Stimmen

In welchen Fällen sollte ich malloc und/oder new verwenden?

Ich sehe, dass es in C++ mehrere Möglichkeiten gibt, Daten zuzuweisen und freizugeben, und ich verstehe, dass Sie beim Aufruf von malloc sollten Sie anrufen free und wenn Sie die new Operator sollten Sie koppeln mit delete und es ist ein Fehler, die beiden zu vermischen (z.B. Aufruf von free() auf etwas, das mit dem Programm new Operator), aber ich bin mir nicht sicher, wann ich die malloc / free und wann sollte ich die new / delete in meinen Programmen der realen Welt.

Wenn Sie ein C++-Experte sind, lassen Sie mich bitte wissen, welche Faustregeln oder Konventionen Sie in dieser Hinsicht befolgen.

6voto

PSkocik Punkte 54603

Wenn Sie mit Daten arbeiten, die keine Konstruktion / Zerstörung und erfordert reallocations (z.B. ein großes Array von ints), dann glaube ich, malloc / free ist eine gute Wahl, wie es gibt Ihnen realloc, die viel schneller als new-memcpy-delete ist (es ist auf meinem Linux-Box, aber ich denke, dies kann Plattform abhängig sein). Wenn Sie mit C++-Objekten arbeiten, die nicht POD sind und Konstruktion/Destruktion erfordern, dann müssen Sie die new- und delete-Operatoren verwenden.

Jedenfalls sehe ich keinen Grund, warum man nicht beides verwenden sollte (vorausgesetzt, man gibt den zugewiesenen Speicher frei und löscht mit new zugewiesene Objekte), wenn man den Geschwindigkeitsvorteil (manchmal einen erheblichen, wenn man große POD-Arrays neu zuweist) nutzen kann, den realloc einem geben kann.

Wenn Sie es nicht brauchen, sollten Sie in C++ bei new/delete bleiben.

6voto

user3488100 Punkte 39

Wenn Sie C++ verwenden, versuchen Sie, new/delete anstelle von malloc/calloc zu verwenden, da dies Operatoren sind. Für malloc/calloc müssen Sie einen weiteren Header einfügen. Mischen Sie nicht zwei verschiedene Sprachen im selben Code. Ihre Arbeit ist in jeder Hinsicht ähnlich, beide weisen Speicher dynamisch aus einem Heap-Segment in einer Hashtabelle zu.

4voto

kungfooman Punkte 3915

new initialisiert die Standardwerte der Struktur und verknüpft die Verweise in ihr korrekt mit sich selbst.

z.B.

struct test_s {
    int some_strange_name = 1;
    int &easy = some_strange_name;
}

Also new struct test_s eine initialisierte Struktur mit einer Arbeitsreferenz zurück, während die malloc'ed-Version keine Standardwerte hat und die internen Referenzen nicht initialisiert sind.

3voto

Fred Larson Punkte 58721

Wenn Sie C-Code haben, den Sie nach C++ portieren wollen, können Sie alle malloc()-Aufrufe darin belassen. Für neuen C++-Code würde ich empfehlen, stattdessen new zu verwenden.

3voto

Peiti Li Punkte 4004

Von einem niedrigeren Standpunkt aus betrachtet, wird new den gesamten Speicher initialisieren, bevor der Speicher übergeben wird, während malloc den ursprünglichen Inhalt des Speichers beibehält.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X