malloc、free和new、delete的区别
malloc VS new
上一篇博客我们分析了C标准库的内存分配和释放的函数malloc、free这两个函数,相信大家对动态内存分配和释放都有了一定的了解,这里我们再分析一下C++的动态内存分配。用过C++的都应该知道,new可以用来动态创建对象,在创建对象的过程中也分配了内存空间,那么,new和malloc的区别是什么呢?下面我们就来详细说一下。
- malloc是标准库的一个库函数,而new是C++语言的一个运算符,也是一个关键字,两者底层实现不同
- malloc使用时需要明确指出申请多少内存,由malloc的long型参数指出,而new运算符不用这么做,我们在使用new运算符时只需要指定申请的数据类型和元素的个数(数组),new运算符会自动计算需要申请多少内存。
- malloc申请成功返回一个void*类型的指针,指向所分配的内存,需要用户手动转换为所需的类 型,而new返回的是对应类型的指针。
- new运算符在为类对象或者结构体变量申请内存时会自动调用对应类或结构体的构造函数,对对象或结构体变量进行初始化,因此我们可以在new一个对象的时候顺便对对象或者结构体变量进行初始化,而malloc只是简单的分配内存,分配成功之后用户需自行利用memset函数进行初始化。
- malloc申请内存失败返回的是NULL指针,而new申请失败则直接抛出异常。
从上面我们可以看出,new和malloc存在着很大的区别,因此在实际编程时需要谨慎使用,根据实际情况选择合适的方式来动态申请内存。
free VS delete
上面分析了malloc和new的区别,这里我们也顺便分析一下free和delete的区别吧。我们知道,free和delete都能够释放内存,那么它们不同之处是什么呢?请看下面分析:
- free是一个标准库函数,而delete是一个运算符,实现机制不同。
- free需要传入一个由malloc返回的有效指针,并且在使用时需要先判断该指针是否为NULL指针。
- delete使用时是先调用对应类对象的析构函数,再对类对象所占据的内存进行释放,而free只是简单地释放内存。
- delete有两种使用方式,一种是delete p(释放一个对象所占的内存),另一种是delete []p(释放多个对象所占的内存),而free只有一种函数调用形式。
- 当然,它们也有相同之处,具体如下:
delete和free都不能多次对同一块内存进行释放,否则会引起错误,但是可以重复释放NULL指针。
在对内存空间进行释放之后,不管是使用delete还是使用free,都需要将指向该内存空间的指针置空,防止出现野指针。