通过new和allocator分配内存有什么区别

时间:2013-02-17 13:21:18

标签: c++ memory-management stl allocator

通过new / mallocallocator进行内存分配有什么区别?

如果我们有newmalloc的选项,为什么我们需要一个单独的向量内存分配器?

4 个答案:

答案 0 :(得分:2)

使用new或malloc时,内存管理与编译器运行时中的相应函数硬连线。相反,当使用分配器时,内存管理被委托给可交换的分配器。这允许您更改使用的内存管理功能。

有一些很好的理由可以实现这种额外的抽象和控制。例如见: Compelling examples of custom C++ STL allocators?

答案 1 :(得分:1)

嗯,我认为newmalloc不同,allocator提供不同的功能。 malloc返回未初始化的数据,calloc返回 -ed数据。但是,如果您要创建某个类的实例(newint这些原始类型,bool会调用构造函数,顺便说一句,也被初始化)。 delete会调用析构函数,而free则不会。

对于allocator,它为用户提供了一个抽象层。 allocator可以返回构造对象,非初始化内存空间,或者销毁对象或释放空间。 STL容器使用allocator来获取内存空间并创建对象。

但请注意,由于可以使用自定义allocator,因此allocator不一定会管理new / delete等内存。它可以创建大块内存然后执行一些分配缓存。它可以返回映射到磁盘上文件的区域中的内存地址,以便内部数据进入文件系统,因为它由上层容器修改。它也可以调用new来获取内存。通过这种方式,allocator使用户能够构建位于内存特定区域的容器。因此,对于allocator s,容器的内部逻辑与内存存储的管理方式是分开的。

实际上,您可以编写一个派生自std::allocator的类来实现上述每个功能。


您可能需要阅读this,了解有关allocator的详细讨论。

答案 2 :(得分:0)

allocator课程中有一个allocate(),其中包含以下两个参数:

pointer allocate (size_type n, allocator<void>::const_pointer hint=0);

根据引用of allocate(),通过提及您需要在指定的内存块旁边分配新的内存块,可以使用提示参数来提高性能。所以我相信使用提示你可以分配块,使得它们像数组一样是顺序的。

答案 3 :(得分:0)

分配器是内存管理器。例如,STL容器提供默认分配器,但是可以像本文中的解释那样自定义它们(STL分配器的教程):http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/Allocators-STL.htm

相关问题