在学习C++之前,我们了解到C语言实现动态开启内存空间有malloc,realloc,calloc三种方式。都是在堆上开辟。
- C语言动态开辟空间的方式:
:malloc指开辟size大小的空间
:realloc指将ptr的空间重新开辟为size大小的空间
:calloc指分配num个size大小的空间
以上三种开辟空间成功返回首地址,失败返回NULL。
- C++动态开辟空间方式:
在C++中通过操作符new和delete进行动态内存管理。首先我们来看一下其书写的注意形式:我们发现在使用delete[ ] ptr3的时候并没有写应该释放的个数,那是因为在开辟n个对象之前,先开申请了四个字节用来存放个数N,在其下面再开辟连续空间。
C++中的new是操作符(关键字),而不是函数。那么new是如何实现的呢?
1.内置类型:如果申请的是内置类型,new/delete和malloc/free是没有什么区别的,但是在申请空间失败的时候,new会抛出异常,而malloc则返回NULL。
2.自定义类型:new[N]的时候先申请空间,再构造N个对象,执行N次构造函数。delete[ ]时先调用N次析构函数,再释放空间。
- 那么malloc/free和new/delete有什么区别呢?
- malloc/free是函数,而new/delete是操作符
- malloc申请的空间不能初始化,而new可以,如int new(10);
- malloc申请空间时需要计算所需要的大小,而new只需要int new[10]
- malloc在返回时需要进行强制转换,而new只需在前加上类型即可
- malloc开辟空间失败返回NULL,所以需要判空,new开辟失败抛出异常,所以需要捕获异常
- malloc只能开辟内置类型空间,而new可以开辟自己定义类型空间
动态内存开辟,不要忘记释放,否则就会造成内存泄露---指因为忘记或错误造成程序未能释放掉已开辟的空间,而这些空间已经不能再使用,失去了对该段内存的控制,因而造成内存上的浪费。