抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Kelecn

“唯爱与科技不可辜负!”

简介:关于free和delete的使用

两个同时存在是有它的原因的,free是函数,它只释放内存,但不会调用析构函数,如果用free去释放new申请的空间,会因为无法调用析构函数而出现不必要的错误。

1
2
3
4
5
6
7
8
char *point = (char *) malloc(100);  
strcpy(point, “hello”);
free(point); // Be careful here,point 所指的内存被释放,but point 所指的地址仍然不变

if(point != NULL) // 没有起到防错作用
{
strcpy(point, “jackery”); // error
}

这段程序中,原来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() 不具备。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

总访问量为 访客数为

粤ICP备2021157327号

载入天数...载入时分秒...