如何让对象在内存中的特定位置构建自己?

时间:2010-07-15 12:55:25

标签: c++ stl allocator

  

可能重复:
  Create new C++ object at specific memory address?

我正在编写本质上是一个对象池分配器,它将分配一个类。我正在分配足够的内存来适应我需要的对象,我正在传递指向内部空间的指针。

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

4 个答案:

答案 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)

新位置可能有所帮助。

What uses are there for "placement new"?

答案 3 :(得分:0)

使用placement new

char memory[sizeof(Myclass)];    
void* place = memory;          

Myclass* f = new(place) Myclass();   

记住

  

您还要全权负责破坏放置的物体。这是通过显式调用析构函数来完成的:

 f->~Myclass();

编辑

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