new
平常使用的new都是new operator(new操作符),它是语言内置的,无法重载。
new的第一种写法://call new operator
intp=newint(3);
调用new operator后做了两件事:
1、调用operator new分配内存。
2、调用构造函数初始化对象。
operator new声明如下:
//operator new's declaration
voidoperatornew(size_t size);
它可以被重载,但是第一个参数类型必须是size_t, 决定分配内存的大小。
可以调用operator new只进行内存分配:
//call operator new
voidv=operatornew(4);
new的第二种写法:
//another way of calling new operator
inti=new(v)int(5);调用new operator后做了两件事:
1、调用placement new,这里不分配内存,只返回传入的指向内存的指针。
2、调用构造函数初始化对象。
placement new的实现可能像这样:
//placement new
voidoperatornew(size_t,voidlocation)
{
returnlocation;
}全局的placement new不能被重载,也就是说无法定义声明为 void operator new(size_t, void ) 的函数。
new的第三种写法:
//array
intp=newint[4];调用new operator后做了两件事:
1、调用operator new[],分配内存。
2、对数组里的每一个对象调用构造函数。
可重载,声明如下:
//operator new[]'s declaration
voidoperatornew;
delete:
平常使用的delete是delete operator(delete操作符),不能被重载。
delete的第一种写法:
//delete operator
delete p;
调用delete operator时做了如下两件事:
1、调用析构函数。
2、调用operator delete释放内存。
operator delete声明如下:
//operator delete's declaration
voidoperatordelete(void*p)
operator delete只释放内存,不调用析构函数,可以被重载,可以像这样调用:
//call operator delete
operatordelete(p);
delete的第二种写法:
//array
delete[] p;
调用delete operator时做了如下两件事:
1、对数组里的每个对象调用析构函数。
2、调用operator delete[]释放内存。
可重载,声明如下:
//operator delete[]'s declaration
voidoperatordeletel
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/21187
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!