Frage

Duplizieren von: In welchen Fällen kann ich malloc verwenden vs neu?

Just Re-Lektüre dieser Frage:
Was ist der Unterschied zwischen " neu“und "malloc" und "calloc" in C ++?

Ich habe die Antworten aber niemand beantwortet die Frage:

  • Wann würde ich verwenden malloc statt neu?

Es gibt ein paar Gründe, (ich von zwei denken kann).
Lassen Sie die besten Schwimmer nach oben.

War es hilfreich?

Lösung

Ein Paar, das in dem Sinne:

  • Wenn Sie Code benötigen tragbare zwischen C ++ und C zu sein.
  • Wenn Sie Speicher in einer Bibliothek sind die Zuteilung, die von C bezeichnet werden kann, und der C-Code hat die Zuordnung zu befreien.

Andere Tipps

Von der Stroustrup FAQ auf new/malloc ich auf diesem Thread geschrieben:

  

Wenn Sie malloc () verwenden Sie die Initialisierung und Konvertierung des Rück Zeiger auf eine richtige Art berücksichtigen müssen. Sie müssen auch prüfen, ob Sie die Anzahl der Bytes direkt für Ihren Einsatz bekam. Es gibt keinen Unterschied in der Leistung zwischen malloc () und neu, wenn Sie der Initialisierung zu berücksichtigen.

Dies sollte Ihre Frage beantworten.

Der beste Grund, von dem ich denken kann malloc in C ++ zu verwenden ist, wenn sie mit einem reinen C-API interagieren. Einige C-APIs Ich habe mit nehmen den Speicher bestimmter Parameter gearbeitet. Als solche sind sie verantwortlich für die Speicherfreigabe und damit der Speicher muss über frei frei Lage sein. Malloc wird für diese puprose arbeiten, aber nicht unbedingt neu.

In C ++, fast nie. Neu ist in der Regel ein Wrapper um malloc, die Konstrukteure (falls zutreffend.) ruft

jedoch zumindest mit Visual C ++ 2005 oder besser, malloc tatsächlich in die Sicherheitslücken über neue können.

Betrachten Sie diesen Code ein:

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

Sie sehen equivelent. die codegen zum ersten jedoch tatsächlich für einen Integerüberlauf in count * sizeof(MyStruct). prüft, ob Zählung von einer unstrusted Quelle kommt, kann es ein Integer-Überlauf, was zu einer geringen Menge an Speicher zugewiesen werden, aber dann verursachen, wenn Sie count überrannt Sie den Puffer.

Jeder erwähnt hat (mit etwas anderen Worten), wenn eine C-Bibliothek, die frei () und es gibt eine Menge von Menschen in Ihrer Umgebung.

verwenden wird

Die andere Situation, die ich sehe, ist:

Wenn Sie Ihre eigene Speicherverwaltung Witting (weil aus irgendeinem Grund, die Sie durch die Modellierung der Standard entdeckt haben, ist nicht gut genug). Sie könnten Speicherblock mit malloc und die Initialisierung der Objekte innerhalb der Pools mit Platzierung neuer zuzuweisen.

Einer der Gründe ist, dass in C ++, können Sie die neuen Betreiber überlasten.

Wenn Sie sicher sein wollen in Ihrem Code die Systembibliothek Speicherzuweisung zu verwenden, könnten Sie malloc verwenden.

Ein C ++ Programmierer selten sollte, wenn überhaupt brauchen malloc zu nennen. Der einzige Grund, dies zu tun, dass ich denken kann ein schlecht konstruiertes API wäre, die Sie in malloc'd Speicher passieren zu erwarten, da es den freien tun würde. In Ihrem eigenen Code sollte neu immer gleich von malloc sein.

Wenn der Speicher durch freie freigegeben werden () (in Ihrem oder jemand anderen Code), ist es verflixt erforderlich malloc zu verwenden.

Ansonsten bin ich nicht sicher. Ein erfundener Fall ist, wenn Sie nicht wollen destructor (n) an der Ausfahrt ausgeführt werden, aber in diesem Fall sollten Sie vielleicht Objekte, die einen no-op dtor sowieso.

Sie können malloc verwenden, wenn Sie nicht wollen, über den Fang Ausnahmen kümmern müssen (oder eine Nicht-Wurf Version neuer verwenden).

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