在已分配的内存上调用构造函数

时间:2009-02-06 10:33:02

标签: c++ constructor

这是一个简短的问题:

使用C ++,如何在已经分配的内存区域上调用构造函数?

3 个答案:

答案 0 :(得分:41)

您可以使用展示位置新构造函数,该构造函数带有一个地址。

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

请在C++ FAQ liteMSDN查看更详细的说明。你需要确保内存正确对齐(malloc应该返回正确对齐的内存,但要注意像SSE这样可能需要对齐到16字节边界的内容。

答案 1 :(得分:5)

请注意,在调用placement new之前,您需要在内存上调用析构函数 - 至少如果该对象具有非平凡的析构函数或包含具有的成员。

对于类obj的对象指针Foo,可以如下显式地调用析构函数:

obj->~Foo();

答案 2 :(得分:3)

接受答案提到的放置新构造函数是在header中定义的allocator类之前的旧方法。现在你真的应该做(用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); 

那就是它。