new和delete2

new

平常使用的new都是new operator(new操作符),它是语言内置的,无法重载。

new的第一种写法:new和delete2//call new operator

new和delete2
intp=newint(3);
调用new operator后做了两件事:

1、调用operator new分配内存。

2、调用构造函数初始化对象。

operator new声明如下:
new和delete2//operator new's declaration

new和delete2
void
operatornew(size_t size);
它可以被重载,但是第一个参数类型必须是size_t, 决定分配内存的大小。

可以调用operator new只进行内存分配:
new和delete2//call operator new

new和delete2
voidv=operatornew(4);


new的第二种写法:
new和delete2//another way of calling new operator

new和delete2
int
i=new(v)int(5);调用new operator后做了两件事:

1、调用placement new,这里不分配内存,只返回传入的指向内存的指针。

2、调用构造函数初始化对象。

placement new的实现可能像这样:

new和delete2//placement new

new和delete2
voidoperatornew(size_t,voidlocation)

new和delete2new和delete2
{

new和delete2
returnlocation;

new和delete2}
全局的placement new不能被重载,也就是说无法定义声明为 void operator new(size_t, void ) 的函数。





new的第三种写法:

new和delete2//array

new和delete2
intp=newint[4];调用new operator后做了两件事:

1、调用operator new[],分配内存。

2、对数组里的每一个对象调用构造函数。

可重载,声明如下:

new和delete2//operator new[]'s declaration

new和delete2
void
operatornew;



delete:

平常使用的delete是delete operator(delete操作符),不能被重载。

delete的第一种写法:

new和delete2//delete operator

new和delete2
delete p;
调用delete operator时做了如下两件事:

1、调用析构函数。

2、调用operator delete释放内存。

operator delete声明如下:
new和delete2//operator delete's declaration

new和delete2
voidoperatordelete(void*p)
operator delete只释放内存,不调用析构函数,可以被重载,可以像这样调用:
new和delete2//call operator delete

new和delete2
operatordelete(p);


delete的第二种写法:
new和delete2//array

new和delete2
delete[] p;
调用delete operator时做了如下两件事:

1、对数组里的每个对象调用析构函数。

2、调用operator delete[]释放内存。

可重载,声明如下:
new和delete2//operator delete[]'s declaration

new和delete2
voidoperatordeletel

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/21187

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午11:13
下一篇 2023年2月7日 下午11:15

相关推荐