new/operator运算符,operator new/operator delete函数,定位new

new,delete运算符:
当我们使用一条new表达式时,实际上执行了三步操作:第一步,new表达式调用一个名为operator new(或者operator new[])的标准库函数,该函数分配一块足够大的,原始的,未命名的内
存空间以便存储特定类型的对象(或对象数组);第二部,编译器运行相应的构造函数以构造这些对象,并为其传入初始值;第三部,返回一个指向该对象的指针。
当我们使用一条delete表达式时,实际执行了两部操作:第一步对指针所指的对象或数组中的元素执行对应的析构函数,第二部,编译器调用名为operator delete(或者 operatordelete[])的
标准库函数释放内存空间。


operator new(或operator new[])/operator delete(或operator delete[])函数
我们实际并不能重载new/delete运算符,但是我们可以自定义operator new/operator delete函数,以达到间接重载new/delete运算符的目的:
即使标准库中已经存在operator new/operator delete函数,我们任就可以定义自己的版本,编译器不会对这种重复的定义提出异议,相反,编译器将使用我们自定义的版本替换标准库定义的版本。
当编译器遇到new/delete表达式时,会在相应的程序中查找可调用的operator new/operator delete函数。如果被分配(或释放)的对象是类类型对象,则编译器首相将在类及其基类的作用域中查找,如果
没找到,就会继续在全局作用域中查找,如果还是没有查找到,则使用标准库定义版本。


定位new:
operator new(或者operator new[])函数只是分配原始内存,并不能构造对象。对于operator new函数分配的内存,我们只能使用定位new构造对象,定位new也能在非动态内存上构造对象;
对于对象的析构,我们必须显示使用其析构函数,析构函数会清除给定的对象但是不会释放内存,如果需要的话我们可以重新使用该内存。定位new的几种形式如下:
new (place_addr) type
new (place_addr) type (initializers)
new (place_addr) type[size]
new (place_addr) type[size]{braced initializer list}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值