2009-02-06 48 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); 

就是这样。