2016-01-28 12 views
5

Ich versuche den Code anderer Personen in C++ zu verstehen, aber es gibt eine seltsame Verwendung von Konstruktor, den ich noch nie gesehen habe. Der Code sieht wie folgt aus:Seltsame Verwendung des Konstruktors in C++

A* a = new A(some initial values...); 
... 
B* b = new (a) B(some initial values...); 

Wenn variable Initialisierung b dort (a) zwischen new und B(...) ist. Was bedeutet das?

+13

Google "Platzierung neu" – Bathsheba

+1

einige Haarspalterei: Dies ist nicht der Konstruktorcode, aber dieser Code ruft den Konstruktor auf. – user463035818

+3

Aber es sieht seltsam aus, Placement neu auf einer anderen Klasseninstanz zu verwenden - A. – marcinj

Antwort

7

Die Codezeile:

B* b = new (a) B(some initial values...); 

ist ein "placement new" verwenden.

Das Standardverhalten; Es erstellt das neue Objekt vom Typ B an demselben Speicherort wie das Objekt a. Wenn für die neue Platzierung eine Überladung vorhanden ist, ist das Verhalten wie in der Überladung codiert, was auch ein Verhalten des Standardtyps beinhalten könnte.

Der Code muss mit allen möglichen Überlastungen, Speicherlayout der Objekte und wie die Klassen A und B zueinander in Beziehung stehen in Betracht gezogen werden.

Es ist ungewöhnlich, ein Objekt über dem Ort eines zuvor erstellten Objekts zu erstellen. Ich würde mir vorstellen, dass hier ein Code zwischen den beiden beiden vorhanden ist, der das vorherige Objekt a dekonstruiert (aber immer noch den Speicher "allokiert" lässt), bevor er an seiner Stelle das neue Objekt erstellt.

Die isocpp FAQ hat einige weitere Hinweise zur Verwendung dieser Technik und ihrer Gefahren.

+1

Was passiert dann mit "a"? Wie teilen sie sich den gleichen Ort? –

+2

@ Selman22. Hängt davon ab, welchen anderen Code es gibt. Offen gesagt, ich denke der Code riecht. – Niall

+3

Es muss nicht unbedingt am gleichen Ort erzeugt werden, da könnte eine Überladung von 'operator new (size_t, A *)' auftreten, die etwas völlig anderes macht (zB ruft 'return a-> allocate (sizeof (B))') –

2

Dies ist der so genannte Platzierung neue Syntax.

Vielleicht merkt man das nicht, aber neu verhält sich meist als eine Standard-C++ - Funktion und kann daher überschrieben werden und manchmal auch zusätzliche Parameter akzeptieren. In diesem Fall wird ein zusätzlicher Parameter (Argument) an die Funktion new der Klasse B übergeben: a.

Sie können mehr dazu lesen Sie zum Beispiel here

0

new expression

Falls nicht überlastet (in diesem Fall könnte es sogar die Festplatte formatieren), bedeutet B bei a, Standort konstruieren, ohne neue Zuteilung Erinnerung um ihrer selbst willen.

+1

Das ist der Standard-Operator placement-new, aber dies könnte einen überladenen' operator new (size_t, A *) 'verwenden, der einen völlig anderen Speicherort zurückgeben könnte als den gleichen 'a'. –

+0

@ JonathanWakely Dilly notiert und bearbeitet, danke. –

Verwandte Themen