2009-02-06 54 views

回答

35

您可以使用放置新的構造函數,該構造函數需要一個地址。

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

看看在C++ FAQ liteMSDN更詳細的解釋。您需要確保內存正確對齊(malloc應該返回正確對齊任何內存的內存,但要小心SSE等可能需要對齊至16個字節邊界的東西)。

+3

對於其他人而言,我不得不'#include `在這之前工作 - g ++拋出了一堆無用的「不匹配函數」錯誤,如果我沒有。 [This](http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10)是關於放置新的信息(也是C++ FAQ),它幫助我理解了它。 – 2011-03-21 01:22:05

6

請注意,在調用展示位置new之前,您需要調用內存中的析構函數 - 至少如果對象具有非平凡的析構函數或包含具有的成員。

對於類的一個對象指針objFoo析構函數可以明確地被稱爲如下:

obj->~Foo(); 
+2

爲什麼我們應該在新分配的內存之前調用析構函數,然後再進行新的分配?我沒有明白... – Malkocoglu 2009-02-06 12:29:59

2

通過接受的答案中提到的新放置的構造是在報頭中定義的分配器類前舊的方式。現在你真的應該做(在C++ 11風格):

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); 

就是這樣。