这是一个简短的问题:
使用C ++,如何在已经分配的内存区域上调用构造函数?
答案 0 :(得分:41)
您可以使用展示位置新构造函数,该构造函数带有一个地址。
Foo* foo = new (your_memory_address_here) Foo ();
请在C++ FAQ lite或MSDN查看更详细的说明。你需要确保内存正确对齐(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);
那就是它。