【发布时间】:2009-02-06 10:33:02
【问题描述】:
如何在已分配的内存区域上调用构造函数?
【问题讨论】:
标签: c++ constructor
如何在已分配的内存区域上调用构造函数?
【问题讨论】:
标签: c++ constructor
你可以使用placement new构造函数,它接受一个地址。
Foo* foo = new (your_memory_address_here) Foo ();
查看C++ FAQ lite 或MSDN 的更详细说明。唯一需要确保内存正确对齐的事情(malloc 应该返回正确对齐的内存,但要注意可能需要对齐到 16 字节边界左右的 SSE)。
【讨论】:
#include <new> 才能工作 - 如果我不这样做,g++ 会抛出一堆无用的“无匹配函数”错误。 This 是关于安置新的信息(也是 C++ 常见问题解答),它帮助我弄清楚了。
请注意,在调用放置 new 之前,您需要在内存上调用析构函数 - 至少如果对象具有非平凡析构函数或包含具有非平凡析构函数的成员。
对于类Foo的对象指针obj,可以如下显式调用析构函数:
obj->~Foo();
【讨论】:
接受的答案提到的放置新构造函数是在 header 中定义的分配器类之前的旧方法。现在你真的应该这样做(以 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);
就是这样。
【讨论】:
std::allocator::construct 用于实例化由std::allocator::allocate 提供的内存中的对象,而不是任意其他来源