2010-09-21 9 views

Antwort

37

Dies wird die Platzierung neuer Operator genannt. Damit können Sie den Speicher bereitstellen, dem die Daten zugewiesen werden, ohne dass der Operator new diesen zuweisen muss. Zum Beispiel:

Das oben genannte wird Speicher für Sie reservieren.

void * fm = malloc(sizeof(Foo)); 
Foo *f = new (fm) Foo(); 

Die oben wird die durch den Aufruf von malloc zugewiesenen Speicher verwenden. new wird nicht mehr zuweisen. Sie sind jedoch nicht auf Klassen beschränkt. Sie können einen neuen Operator placement für jeden Typ verwenden, den Sie mit einem Aufruf an new zuordnen würden.

Ein 'Gotcha' für die Platzierung neu ist, dass Sie nicht freigegebenen Speicher durch einen Aufruf an die Platzierung neuen Operator mit dem Schlüssel delete freigeben sollten. Sie werden das Objekt zerstören, indem Sie den Destruktor direkt aufrufen.

f->~Foo(); 
+2

Ja. Siehe auch [diese Antwort] (http: // stackoverflow.com/questions/2697892/what-is-return-typ-of-new-in-c/2697929 # 2697929) für die Differenz zwischen einem _new Ausdruck_ und der tatsächlichen Speicherbelegung. – sbi

+2

"' new' wird nicht mehr zuweisen. " - für das Objekt als eine feste Größe - sicher, aber natürlich wird es dynamischen Speicher zuweisen, wenn das Objekt es benötigt - Strings, Framebuffer, Datenbanken, was auch immer. –

2

Ich bin auf diesem eine rostige aber es können Sie das Objekt in einen Speicherblock schreiben, die Sie bereits zugewiesen haben. Es benötigt auch eine reziproke Löschanweisung, um es aus dem Speicher zu löschen.

2

Wenn Sie einen Speicherpool verwenden, müssen Sie den In-Place-Konstruktor verwenden, um Ihr Objekt zu initialisieren, wenn sie aus dem Pool zugewiesen werden.

1

Es ist eine Möglichkeit, einen Konstruktor aufzurufen, ohne Speicher zuzuweisen. Ihr y muss ein Zeiger sein, der genug Speicher für ein neues Datatype-Objekt enthält. Rufen Sie auch nicht delete, rufen Sie ~DataType().

7

Die kurze Antwort ist, dass Ihr Code ein Objekt in dem Raum erstellt, auf den y zeigt. Die lange Antwort wird am besten von der C++ FAQ abgedeckt.

4

Dies wird häufig auch als 'Platzierung neuer' bekannt und wird sehr gut durch die C++ FAQ diskutiert (im Bereich 'Destructors'):

Es erlaubt Sie können Objekte im Rohspeicher konstruieren, was in bestimmten speziellen Situationen nützlich sein kann, wenn Sie beispielsweise ein Array für eine große Anzahl möglicher Objekte reservieren möchten, aber dann wie benötigt konstruieren möchten, da Sie häufig nirgends n benötigen Ohr das Maximum, oder weil Sie einen benutzerdefinierten Speicherzuordner verwenden möchten oder müssen.