3

可能重复:
在特定内存地址创建新的 C++ 对象?

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

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

4

4 回答 4

10

您使用新的展示位置。像这样:

new( pointer ) MyClass();
于 2010-07-15T12:57:44.447 回答
3

使用新的展示位置。

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()
于 2010-07-15T14:32:35.857 回答
2

安置新的可能会有所帮助。

“安置新”有什么用?

于 2010-07-15T12:58:34.380 回答
0

使用展示位置新

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

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

记住

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

 f->~Myclass();

编辑

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

于 2010-07-15T12:59:08.393 回答