进一步了解 new 和 delete

什么是new

new 是C++中的一个关键字,同时也是操作符。我们在使用new在堆上开辟空间创造对象时。实际上做了三件事:
1.首先开辟一块内存空间,和malloc不同,malloc开辟失败返回NULL而new开辟失败直接报错,
2.然后调用了构造函数,当我们new 一个自定义类型时,及new了一个对象,系统会自动调用对象的构造函数进行初始化。
3.返回正确的指针

class A
{
A()
{}
};
A*   a=new A;

实际上完成了如下三步操作
A* a = (A*)malloc(sizeof(A));
a->A();
return a;

new operator、operator new

new operator 就是我们平时所使用的new。
而 operator new 也叫new操作符,它相当于malloc,只开辟空间,这一步操作

delete

delete和new对应,delete在使用时会系统自动调用对象的析构函数,而free只会释放内存而不进行一些清理工作。注意new/delete不是库函数,而是表达式。operator delete是标准库函数相当于free释放内存空间,delete调用它实现的释放空间

int a = new int;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)   
int a = new int(1);//开辟一个存放整数的空间,并指定该整数的初值为1,返回一个指向该存储空间的地址   
int *a = new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址  
delete [] pt;//在指针变量前面加一对方括号,表示是对数组空间的操作

new[ ] & delete[ ]

和使用new时类似的,在使用 new[ ] 的时候也做了两件事:
1、调用operator new开辟空间
2、调用N次构造函数初始化N个对象

同样的,在使用delete[]的时候也做了两件事:
1、调用N次析构函数清理N个对象
2、调用operator delete函数释放空间
注意:new和delete要匹配使用,new的数组就要用delete[ ] ,对与变量可能不会报错但是,对于自定义类型,对象会调用构造析构。构造次数和析构次数不匹配这样很危险。

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/81459207