简介:关于free和delete的使用
两个同时存在是有它的原因的,free是函数,它只释放内存,但不会调用析构函数,如果用free去释放new申请的空间,会因为无法调用析构函数而出现不必要的错误。
1 | char *point = (char *) malloc(100); |
这段程序中,原来free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。指针point被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,point成了“野指针”。如果此时不把point设置为NULL,会让人误以为point是个合法的指针。如果程序比较长,我们有时记不住 point 所指的内存是否已经被释放,在继续使用point 之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便point不是NULL指针,它也不指向合法的内存块。为了避免失误,最好在free之后或者之前,将指针指向NULL
new()/delete()与 malloc()/free() 区别
1.malloc()/free() 是标准库函数, 使用前需调用库头文件 <stdlib.h> 方可使用;而 new/delete 是运算 符,执行效率更高。
2.malloc() 需要手工计算字节数;而 new 能够自动计算需要分配的内存空间。
3.malloc() 返回的指针是 void 类型;而 new*返回的指针是它分配空间的类型。
4.new 时调用构造函数,而 malloc() 不能;delete 时调用析构函数,而 free() 不能。
5.new 在申请单个类型变量时可以赋初值,而 malloc() 不具备。