C ++ STL分配器与运算符new

根据C ++ Primer第4版,第755页,有一条说明:   现代C ++程序通常应该使用allocator类   分配内存。它更安全,更灵活。 我不太明白这个说法。 到目前为止,我读到的所有材料都使用
new
来教授用C ++分配内存。 本书中展示了向量类如何利用分配器的示例。 但是,我想不出其他情况。 任何人都可以帮忙澄清这个陈述吗?并举个更多例子? 我应该何时使用分配器以及何时使用
new
?谢谢!     
已邀请:
对于一般编程,是的,你应该使用
new
delete
。 但是,如果你正在写一个图书馆,你不应该! 我没有你的教科书,但我想它正在编写库代码的上下文中讨论分配器。 库的用户可能想要精确控制从哪里分配的内容。如果所有库的分配都经过
new
delete
,则用户将无法获得该细粒度的控制级别。 所有STL容器都使用可选的allocator模板参数。然后容器将使用该分配器来满足其内部存储器需求。默认情况下,如果省略分配器,它将使用
std::allocator
,它使用
new
delete
(具体地说,
::operator new(size_t)
::operator delete(void*)
)。 这样,该容器的用户可以根据需要控制分配内存的位置。 实现与STL一起使用的自定义分配器的示例,以及解释:使用STL的自定义池分配器提高性能 附注:分配器的STL方法在几个方面是非最优的。我建议阅读更好的分配器模型,以讨论其中的一些问题。     
这两者并不矛盾。分配器是一个PolicyPattern或StrategyPattern,由STL库的容器适配器用于分配内存块以供对象使用。 这些分配器通过允许来经常优化内存分配   *一次分配的元素范围,然后使用新的位置初始化   *根据块大小从二级专用堆中选择的项目 无论如何,最终结果将(几乎总是)为对象分配新的(放置或默认) 另一个生动的例子是如何例如boost库实现了smartpointers。由于智能指针非常小(开销很小),因此分配开销可能会成为负担。实现定义一个专门的分配器来进行分配是有意义的,因此可以有一个高效的std :: set<> of smartpointers,std :: map< ...,smartpointer>等。 (现在我几乎可以肯定,通过避免任何虚拟,即vft,使类成为POD结构,仅使用原始指针作为存储,增强实际上优化了大多数智能指针的存储;一些示例将不适用。但是,推断其他类型的smartpointer(引用智能指针,指向成员函数的指针,带有实例引用的成员函数指针等))     

要回复问题请先登录注册