文档章节

free 和delete,你到底做了些什么事情?

Jackery_Shh
 Jackery_Shh
发布于 2015/04/09 11:48
字数 401
阅读 6
收藏 0

在指针满天飞的C/C++世界,是否已经熟悉并默认了一些东西,而让我们失去了更深刻思考的能力?也许你对new/delete 或者malloc/free已经司空见惯,可曾相关在你手下delete/free一块对内存,到底发生了什么?请看下面的程序:

char *point = (char *) malloc(100);
strcpy(point, “hello”);
free(point); // Be careful here,point 所指的内存被释放,but point 所指的地址仍然不变
…
if(point != NULL) // 没有起到防错作用
{
strcpy(point, “jackery”); // error
}</span>

所谓的C++/C free or delete 一个变量指针或者数组,是做了哪些事情呢?原来freedelete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。如果你follow一下,就会发现指针pointfree以后其地址仍然不变(非NULL),只是

该地址对应的内存是垃圾,point成了“野指针”。如果此时不把point设置为NULL,会让人误以为point是个合法的指针。如果程序比较长,我们有时记不住 point 所指的内存是否已经被释放,在继续使用point 前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便point不是NULL指针,它也不指向合法的内存块。你可能还有疑问,有了malloc/free (C/C++标准可函数),为何还要来个new/delete (c++运算符)点击这里,你可以找到答案!




© 著作权归作者所有

Jackery_Shh
粉丝 5
博文 144
码字总数 252072
作品 0
朝阳
私信 提问
C++ — new和delete的总结

C++动态内存管理 C语言用malloc,calloc,relloc和free来进行动态内存管理。但是在C++中就变得不一样了。C++通过new和delete动态管理内存。 new/delete动态管理 对象。 new[]/delete[]动态管理...

Dawn_sf
2017/03/13
0
0
Azkaban的线程系列 36:AzkabanWebServer-Cleaner-Thread

此线程 azkaban.executor.ExecutorManager$CleanerThread.run -----------------------------------------------------------------------------------------------------------------------......

强子哥哥
2016/04/13
93
0
内存跟踪,内存泄露,内存

这个坑其实很大很大。。。。。。 虽然这名字很长,但其实就是一码事,试问你做内存跟踪不是为了看泄露?试问你看到了泄露和碎片不回去优化?哈哈 理论知识咱不具备,所以现实点,从实践出发好...

nothingfinal
2012/04/29
0
0
今日小小的感悟(2009/04/09)

unix/linux基本哲学之:一切皆文件!这是一条真理,一切皆文件并不是什么神秘的事情,“文件”只是一个操作的接口,就如我们知道的那样的,可以读,写,创建,删除,追加等等,“一切皆”的意...

晨曦之光
2012/04/10
42
0
c++ 中的重载全局new,delete

最近做一个小项目,对c++又有很多新的理解。实在不的不让人发出感叹,c++太强大了,绝对不是一朝一夕就可以领悟她的内涵的。 首先我们要清楚,为什么我们要重载new,和delete了?这还不是指针...

shzwork
05/13
15
0

没有更多内容

加载失败,请刷新页面

加载更多

【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[1]:验证模型

CKB 脚本编程简介[1]: 验证模型 本文作者:Xuejie 原文链接:Introduction to CKB Script Programming 1: Validation Model 本文译者:Jason,Orange 译文链接:https://talk.nervos.org/t/c...

NervosCommunity
42分钟前
6
0
消息中间件——RabbitMQ的高级特性

前言 前面我们介绍了RabbitMQ的安装、各大消息中间件的对比、AMQP核心概念、管控台的使用、快速入门RabbitMQ。本章将介绍RabbitMQ的高级特性。分两篇(上/下)进行介绍。 消息如何保障100%的...

Java架构师ya七
今天
9
0
如何编写高质量的 JS 函数(1) -- 敲山震虎篇

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm7Xi7JxQ 作者:杨昆 一千个读者,有一千个哈姆雷特。 此系列文章将会从函数的执行机制、鲁棒性、函...

vivo互联网技术
今天
7
1
学会这5个Excel技巧,让你拒绝加班

在网上,随处都可以看到Excel技巧,估计已看腻了吧?但下面5个Excel技巧会让你相见恨晚。关键的是它们个个还很实用 图一 技巧1:快速删除边框 有时当我们处理数据需要去掉边框,按Ctrl+Shif...

干货趣分享
今天
11
0
JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部