我们还需要“安置新”和“操作员新”吗?

时间:2013-07-26 18:22:55

标签: c++

分配器似乎与“placement new”和“operator new”完成相同的工作。 它的界面更方便。

例如:

string *ps = static_cast<string *>(operator new(sizeof(string)));
new (ps) string("Hello");
cout<<*ps<<endl;

可以改写为

allocator<string> as;
string *ps2 = as.allocate(1);
as.construct(ps2,"Hello");
cout<<*ps2<<endl;

那么这意味着“placement new”和“operator new”已经过时了?

1 个答案:

答案 0 :(得分:5)

他们仍然需要。你还会如何实现自定义分配器? ;)

编辑:

这个答案值得更多解释:

如果您查看std :: allocator的construct成员函数,您可以看到它使用了placement new运算符。

因此,分配器的职责是通过成员函数allocate为对象分配足够大的未初始化存储,然后“就地”通过其construct成员将其构建到此存储中。后者使用placement new执行。