可能重复:
在特定内存地址创建新的 C++ 对象?
我正在编写本质上是一个对象池分配器,它将分配一个类。我正在分配足够的内存来容纳我需要的对象,并且我正在传递指向内部空间的指针。
现在我的问题是:一旦我在我的池中获得了一个指针,我如何在那里构造一个对象?
可能重复:
在特定内存地址创建新的 C++ 对象?
我正在编写本质上是一个对象池分配器,它将分配一个类。我正在分配足够的内存来容纳我需要的对象,并且我正在传递指向内部空间的指针。
现在我的问题是:一旦我在我的池中获得了一个指针,我如何在那里构造一个对象?
您使用新的展示位置。像这样:
new( pointer ) MyClass();
使用新的展示位置。
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()
安置新的可能会有所帮助。
使用展示位置新
char memory[sizeof(Myclass)];
void* place = memory;
Myclass* f = new(place) Myclass();
记住
您还全权负责销毁放置的对象。这是通过显式调用析构函数来完成的:
f->~Myclass();
编辑
在阅读了 Martin York 的评论和标准的相关部分之后,可以肯定的是,您不应该使用上述方法(使用放置在堆栈上的对象与放置新)。正如马丁所建议的那样使用std::vector
with 。placement new