分配器似乎与“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”已经过时了?
答案 0 :(得分:5)
他们仍然需要。你还会如何实现自定义分配器? ;)
编辑:
这个答案值得更多解释:
如果您查看std :: allocator的construct
成员函数,您可以看到它使用了placement new运算符。
因此,分配器的职责是通过成员函数allocate
为对象分配足够大的未初始化存储,然后“就地”通过其construct
成员将其构建到此存储中。后者使用placement new执行。