C++ 如何使对象在内存中的特定位置构造自身?

C++ 如何使对象在内存中的特定位置构造自身?,c++,stl,allocator,C++,Stl,Allocator,可能重复: 我正在编写一个对象池分配器,它将分配一个类。我正在分配足够的内存来满足我需要的对象,并且我正在分发指向内部空间的指针 现在我的问题是:一旦我在我的池中得到一个指针,我如何在那里构造一个对象 您可以使用新位置。像这样: new( pointer ) MyClass(); 新的安置可能会有所帮助 使用 记得吗 您还应全权负责销毁放置的对象。这是通过显式调用析构函数来实现的: f->~Myclass() 编辑 在阅读了Martin York的评论和标准的相关章节后,可以肯定的是

可能重复:

我正在编写一个对象池分配器,它将分配一个类。我正在分配足够的内存来满足我需要的对象,并且我正在分发指向内部空间的指针


现在我的问题是:一旦我在我的池中得到一个指针,我如何在那里构造一个对象

您可以使用新位置。像这样:

new( pointer ) MyClass();

新的安置可能会有所帮助

使用

记得吗

您还应全权负责销毁放置的对象。这是通过显式调用析构函数来实现的:

f->~Myclass()
编辑

在阅读了Martin York的评论和标准的相关章节后,可以肯定的是,您不应该使用上述方法(使用放置在堆栈上的对象放置为new)。使用
std::vector
代替马丁建议的
placement new

使用placement new

std::vector<char> memory(sizeof(Myclass));    
void*             place = &memory[0];          

Myclass* f = new(place) Myclass();
如常见问题解答中所述,这是危险的,因为标准没有提供有关此内存对齐的授权。使用标准向量确实可以保证对齐,因为向量的数据部分是动态分配的,而标准确实可以保证动态分配内存的对齐

发件人:n2521(我桌面上的副本)部分:3.7.3.1

返回的指针应适当对齐,以便可以将其转换为具有基本对齐要求(3.11)的任何完整对象类型的指针,然后用于访问所分配存储中的对象或数组(直到通过调用相应的释放函数显式释放存储)

这让我们看到了3.11

3.11对齐[基本对齐]
5路线的顺序从弱到强或更严格。更严格的路线具有更大的路线值。满足对齐要求的地址也满足任何较弱的有效对齐要求

不要忘记手动调用析构函数:

f->~Myclass()

并记住在释放内存之前调用析构函数。不要将堆栈/全局变量与新位置一起使用。该标准不保证堆栈/全局变量的对齐。因此,您应该使用动态分配的内存(因为标准确实为其对齐方式提供了授权)。所以最简单的方法就是给我们一个向量(因为向量的数据部分是动态分配的)。@马丁:谢谢,我不知道。:)
char     memory[sizeof(Myclass)];  // No alignment guarantees on this.
f->~Myclass()