c++中内存分配(new和operator new)

一 关于new:
(1)new operator:是语言内建的,不能改变其行为。它做两件事:申请内存(调用operator new)和初始化对象(constructor),delete表达式先析构对象和后释放内存。
*new operator是内建操作符,无法为你所控制,但是你可以控制它们所调用的内存分配和释放函数。

(2)operator new:类似c中的malloc,只负责申请内存,operator delete负责释放内存。可以被重载。
*表达形式:operator new 类似c中malloc,operator delete类似c中的free,需要加括号。
*格式:void * operator new(size_t size):返回一个指针,指向一块原始的、未设置初值的内存。
*使用:void *memory=operator new(size)。

(3)placement new(定位new,这里介绍的是placement new中常用的一个):用于在给定内存中初始化对象。表达形式:new (place_address) type()或new (place_address) type(initializer_list)。其中place_address必须是一个指针,Initializer_list提供初值列表。

(4)new/delete 单一对象和new/delete 数组的两个区别:
1.第一个区别:使用operator new[]和operator delete[]:负责数组内存的释放和分配。
*例如:string *ptr=new string[size];
*上述还是new operator,但是它调用的内存分配是operator new[];类似,内存释放时operator delete[]。
2.第二个区别:
*数组版new operator必须针对每一个对象调用一个constructor。
*数组版delete operator必须针对数组中每个对象调用destructor。


(5)总结:
*如果希望将对象产生于heap,请使用new operator。不但分配内存而且为该对象调用一个constructor。程序员无法直接调用"对象初始化所必须的constructor"(尤其是对象可能有vptr),但编译器可以,所以想声明一个head-object时,必须使用new operator.
*如果打算在heap objects产生时自己决定内存分配方式,请写一个自己的operator new,并调用new operator,它会自动调用你写的operator new。
*如果你打算处理原始的、未设置初值的内存,应该完全回避new operator和delete operator,改调用operator new取得内存和operator delete释放内存。
*如果打算在已分配的内存(并拥有指针)中构造对象,请使用placement new。
*如果使用placement new在某块内存中产生对象,应该避免对那块内存使用delete operator。因为delete operator会调用operator delete来释放内存,但是该内存内含的对象可能最初并非是operator new分配得来的。
*new operator和delete operator都是内建操作符,无法为你控制,但是它们所调用的内存分配和释放函数则不然,所以当你想要定制new operator和delete operator,你可以修改它们完成任务的方式。

二 c++提供两种方法分配和释放未构造的原始内存:
(1)allocator类的allocate和deallocate函数:它提供可感知类型的内存分配。
*allocator<T> a;
*a.allocate(n):分配原始的未构造的内存以保持T类型的n个对象。
*a.deallocate(p,n):释放内存,在名为p的T*指针所包含地址处保存T类型的n个对象。

(2)标准库中的operator new和operator delete函数:分配和释放需要大小的原始的未类型化的内存。返回的是void*,是未类型化的内存,使用时需强制类型转换,size_t需要计算字节数(sizeof(类型)),数组还需array_size*sizeof(类型)。
*void *operator new(size_t)
*void *operator new[](size_t)
*void *operator delete(void*)
*void *operator delete[](void*)
(3)C提供的:malloc和free。

(4)allocator类的allocate和deallocate与operator new和operator delete区别:
*allocate成员分配的是类型化的内存,所以使用它可以不必计算以字节为单位的所需内存量,也可以避免对operator new返回值的强制类型转换。类似的,deallocate释放特定类型的内存,也不必转换为void*。
*使用allocator比直接使用operator new和operator delete函数更为类型安全。

三 c++提供的在原始内存中构造和撤销对象的方法:
(1)allocate类的construct和destroy成员函数。
(2)定位new(placement):接受指向未构造内存的指针,并在该空间上初始化一个对象或数组。
(3)直接调用对象的构造函数和析构函数。
(4)算法unintialized_fill和uninitialized_copy。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值