2009-02-06 4 views

Antwort

35

Sie können den neuen Konstruktor placement verwenden, der eine Adresse verwendet.

Foo* foo = new (your_memory_address_here) Foo(); 

Schauen Sie sich auf eine ausführlichere Erklärung am C++ FAQ lite oder MSDN. Die einzige Sache, die Sie sicherstellen müssen, dass der Speicher richtig ausgerichtet ist (malloc soll Speicher zurückgeben, der für alles richtig ausgerichtet ist, aber hüten Sie sich von Dingen wie SSE, die Ausrichtung auf 16 Byte-Grenzen oder so benötigen müssen).

+3

Für alle anderen, die darüber stolpern: Ich musste "# ", bevor dies funktionieren würde - g ++ warf einen Haufen nicht hilfreiche "no Matching Funktion" Fehler, wenn ich nicht tat. [This] (http://www.parashift.com/c++faq-lite/dtors.html#faq-11.10) ist die Information zur Platzierung neu (auch C++ FAQ), die mir geholfen hat, es herauszufinden. –

6

Beachten Sie, dass Sie vor dem Aufrufen der Platzierung new den Destruktor für den Speicher aufrufen müssen - zumindest, wenn das Objekt entweder einen nichttrivialen Destruktor hat oder Mitglieder enthält, die.

Für einen Objektzeiger obj der Klasse Foo der Destruktor explizit aufgerufen werden können wie folgt:

obj->~Foo(); 
+2

Warum sollten wir den Destruktor auf dem neu zugewiesenen Speicher aufrufen, bevor Sie das Placement neu erstellen? Ich bekomme es nicht ... – Malkocoglu

+1

Normalerweise erhalten Sie keinen Speicher, der zugewiesen, aber nicht initialisiert wurde. Wenn das in der Tat das ist, was du hast, dann darfst du natürlich * keinen Destruktor darauf ansprechen. In allen anderen Fällen befindet sich bereits ein Objekt an diesem Ort, das ordnungsgemäß entsorgt werden muss. –

+1

Sie initialisieren Speicher nicht (es sei denn, Sie alle Nullen festlegen). Sie initialisieren Objekte. Das Aufrufen von dtor auf einem zufälligen Speicher ist schlecht. Nur wenn Sie Container von Objekten machen, ist es sinnvoll, dtor aufzurufen. Wenn diese Objekte leer sind, müssen Sie nicht tun. –

2

Die Platzierung neuer Konstruktor durch die akzeptierte Antwort erwähnt ist eine alte Art und Weise vor der allocator Klasse in Header definiert. Jetzt sollten Sie wirklich (in C++ 11 Stil) tun:

allocator<Foo> alloc; 
//Allocate memory for one or n objects 
auto p = alloc.allocate(1); 
//Construct an object of Foo on allocated memory block p, by calling one of Foo's constructors 
alloc.construct(p, args, ...); 

//OK, p now points to a Foo object ready for use... 

//Call Foo's destructor but don't release memory of p 
alloc.destroy(p); 
//Release memory 
alloc.deallocate(p, 1); 

Das ist es.