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

C++ 通过new和allocator分配内存有什么区别,c++,memory-management,stl,allocator,C++,Memory Management,Stl,Allocator,通过new/malloc和allocator分配内存有什么区别 如果我们有new和malloc的选项,为什么我们需要一个单独的vector内存分配器?呃,我认为new和malloc是不同的,并且分配器提供不同的功能malloc返回未初始化的数据,calloc返回未初始化的数据。但是如果您正在创建某个类的实例(不是int,bool这些基本类型,顺便说一句,它们也可以初始化),那么new将调用构造函数delete将调用析构函数,而free则不会 至于分配器,它为用户提供了一个抽象层分配器可以返回构造

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


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

呃,我认为
new
malloc
是不同的,并且
分配器提供不同的功能
malloc
返回未初始化的数据,
calloc
返回未初始化的数据。但是如果您正在创建某个类的实例(不是
int
bool
这些基本类型,顺便说一句,它们也可以初始化),那么
new
将调用构造函数
delete
将调用析构函数,而
free
则不会

至于
分配器
,它为用户提供了一个抽象层<代码>分配器
可以返回构造的对象、未初始化的内存空间、销毁对象或释放空间。STL容器使用分配器获取内存空间并创建对象

但请注意,由于自定义
分配器
是可能的,因此
分配器
不一定像
新建
/
删除
那样管理内存。它可以创建一大块内存,然后分配缓存。它可以在映射到磁盘上的文件的区域中返回内存地址,以便内部数据在上层容器修改时进入文件系统。它还可以调用
new
来获取内存。通过这种方式,
allocator
允许用户构建位于内存特定区域的容器。因此,使用
allocator
s,容器的内部逻辑与内存存储的管理方式分离

实际上,您可以编写一个从
std::allocator
派生的类来实现上面提到的每个特性



您可能想阅读有关
分配器的更详细讨论。

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

有一些很好的理由需要这种额外的抽象和控制级别。例如,请参见:
.

分配器
类中有一个
allocate()
,它采用以下两个参数:

pointer allocate (size_type n, allocator<void>::const_pointer hint=0);
指针分配(大小\类型n,分配器::常量\指针提示=0);

根据参考,提示参数可用于提高性能,方法是提到需要分配与指定内存块相邻的新内存块。所以我相信,使用这个提示,您可以分配块,使它们像在数组中一样是顺序的。

分配器是内存管理器。例如,STL容器提供了默认的分配器,但可以按照本文(STL分配器教程)中的解释对其进行自定义:。

1谷歌搜索:Floris Velleman,我并没有寻找new和delete.Hmm之间的区别。我看不出“复制”如何回答这个具体问题。好吧,也许部分是(“分配器是可插入的”),但它没有解决关于区分分配和构造的具体问题。我也不确定投票被否决的原因。@Florisvellman:那么你如何建议OP从实际的正确信息中过滤掉谷歌上的所有垃圾呢?因此,它旨在为编程问题提供良好、可靠的答案。谷歌不是。因此,你告诉那些在网上提问的人用谷歌搜索它,这是在浪费你自己和其他人的时间。SO的目的是,如果你在谷歌上搜索,SO的答案应该是#1结果。