我正在编写本质上是一个对象池分配器,它将分配一个类。我正在分配足够的内存来适应我需要的对象,我正在传递指向内部空间的指针。
现在我的问题是这样的:一旦我在我的池中得到一个指针,我该如何在那里构建一个对象?
答案 0 :(得分:10)
您使用展示位置新功能。像这样:
new( pointer ) MyClass();
答案 1 :(得分:4)
使用展示位置。
std::vector<char> memory(sizeof(Myclass));
void* place = &memory[0];
Myclass* f = new(place) Myclass();
请勿使用FAQ定义的方法:
char memory[sizeof(Myclass)]; // No alignment guarantees on this.
如常见问题解答中所述,这是危险的,因为标准没有提供关于此内存对齐的受让人。使用标准向量确实可以保证对齐,因为向量的数据部分是动态分配的,标准确实提供了有关动态分配内存对齐的保证。
发件人:n2521(我桌面上的副本)部分:3.7.3.1
返回的指针应适当对齐,以便可以将其转换为具有基本对齐要求(3.11)的任何完整对象类型的指针,然后用于访问分配的存储中的对象或数组(直到存储为通过调用相应的释放函数显式释放。)
我们指的是3.11
3.11对齐[basic.align]
5对齐有从弱到强或更严格的对齐的顺序。更严格的对齐具有更大的对齐值。满足对齐要求的地址也满足任何较弱的有效对齐要求。
不要忘记手动调用析构函数:
f->~Myclass()
答案 2 :(得分:2)
新位置可能有所帮助。
答案 3 :(得分:0)
char memory[sizeof(Myclass)];
void* place = memory;
Myclass* f = new(place) Myclass();
记住
您还要全权负责破坏放置的物体。这是通过显式调用析构函数来完成的:
f->~Myclass();
编辑
在阅读了Martin York的评论和标准的相关部分之后,可以肯定的是,您不应该使用上述方法(使用放置在堆栈中的对象和新的放置)。正如马丁建议的那样,使用std::vector
代替placement new
。