在C语言中我们想要一块内存我们需要怎么做呢??
我们可以直接malloc一块内存,那么在C++中我们先要一块空间需要怎么做呢??
new和delete
new是C++中的一个操作符,首先它和malloc的区别就是malloc是函数,那么我们看一下他们的区别,以及看一下new的使用
我们的new就是后面直接跟类型就可以了,并且不需要我们自己去算需要开辟的大小
那么他们的释放有什么区别吗??
对于malloc来说释放最好使用free,而new出来的空间我们最好使用delete来释放这块空间,我们也最好不要交叉使用
那么我们继续看一下他们的区别
我们想一下,我们的malloc的空间可以初始化吗??
我们的new后面的类型后面带括号可以初始化,我们看到确实把我们的p4指向的空间初始化为了1
那么我们想要开辟一段数组呢??
如果是malloc的话就是直接计算出想要开辟的空间大小,然后直接开辟,但是malloc看起来是更方便一点的,就像数组一样,使用起来更简单一点
那么我们想要初始化new出来的这一段空间呢??
我们看到这样是不可以的,那么我们应该怎么做呢? 其实这里和C语言的数组初始化还是比较相似的,我们往下面看
这样就好了,确实和数组有点像
那么我们值给一个值呢?
我们看到只给了一个值剩下的就用0初始化了
那么new1出来的数组还是使用delete释放吗??
我们这样 释放可以吗??不可以!
对于new的数组而言我们的正确释放应该是这样的
那么如果我们free和delete在这里混用呢?
其实delete和free混用不管在那里都是很危险的,不同的环境结果不同,有一些混用会直接报错,但是我这里并没有
那么new和malloc只有这么一点区别吗?
如果我们对内置类型动态申请内存呢?
我们现在有一个A类,那么我们对A进行动态内存申请呢??
我们看有什么区别?
我们看到new调用了A的构造函数,所以我们的new在进行开辟空间后还会调用构造函数
那么 delete和free有什么区别吗?
我们delete调用了析构函数
malloc和free: 只是单纯的开辟空间和释放空间
new和delete: new在new自定义类型时开辟空间后会调用对于类的构造函数,而delete会调用类的析构函数,然后释放对应空间
我们new在这里调用构造函数,所以我们在这里还可以给初始值
下面我们在看一下对于数组有什么区别
我们看到调用了5次构造,释放的时候有调用了5次析构,所以new和delete在new数组和delete数组的时候时一个一个构造和析构的
operator new 和 operator delete
我们知道我们的new是 开辟空间 + 调用构造函数
delete 是 调用析构函数 + 释放空间
而我们还是知道C++是由C语言转换过来的,那么我们既然有现成的开辟空间的函数我们会不会用呢?? 当然会使用
但是我们的C++是面向对象的,而C语言是面向过程的,如果我们在C语言中malloc失败我们会怎么做,返回空指针,但是在面向对象里面我们的new出错我们需要抛异常,所以我们还需要一个可以在开辟空间失败后抛异常的函数,所以就有了我们的operator new 和operator delete
我们来看一下
我们 先来看一下他们的使用
我们的operator new的使用和malloc的使用一摸一样,我们看一下会不会调用构造
也证明我们刚才说的确实如此,那么我们的operator delete怎么使用呢?? 会不会调用析构
我们的operator delete使用方法和free使用也是一样的,同样不会抛异常
但是我们的opeartor new/delete其实是太轻易为我们的new和delete准备的,而operator new/delete又是使用了malloc和free,但是多加了面向对象的抛异常
我们来看一下反汇编
我们 这里确实call了operator new
我们看到delete的时候我们还是先调用了,对应类的析构,然后call了operator delete
下面我们看一下他们的区别
总结:
1.new/delete是操作符,而malloc/free是函数
2.new后得到的值不需要类型强转,而malloc会返回void*的指针,需要强转
3.new/delete操作比较简单,而malloc/free稍微较复杂
4.new和delete出错了会抛异常,而malloc和free是返回错误码
5.new可以初始化,而malloc不行
6.new和delete对自定义类型会分别调用对应的构造函数和析构函数,而malloc和free只能开辟空间和释放空间
如果上面有不完善的欢迎各位指出!