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

在指针满天飞的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一下,就会发现指针point被free以后其地址仍然不变(非NULL),只是

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



时间: 2024-10-07 19:47:45

free 和delete,你到底做了些什么事情?的相关文章

转Rollback后undo到底做了些什么?

转自:http://biancheng.dnbcw.info/oracle/309191.html Rollback后undo到底做了些什么? 从概念上讲,undo正好与redo相对.当你对数据执行修改时,数据库会生成undo信息,这样万一你执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,就可以利用这些undo信息将数据还原到修改前的样子.Redo用于在失败时还原事务(即恢复事务),undo则用于取消一条语句或者一组语句的作用.与redo不同,undo在数据库内

js中的new()到底做了些什么??

要创建 Person 的新实例,必须使用 new 操作符.以这种方式调用构造函数实际上会经历以下 4个步骤:(1) 创建一个新对象:(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) :(3) 执行构造函数中的代码(为这个新对象添加属性) :(4) 返回新对象. new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在JavaScript中,我们将这类方式成为Pseudoclassical.基于上

SQL 中的 EXISTS 到底做了什么?

本文中提到的所有数据表基于王珊<数据库系统概论(第4版)>. 个人认为 SQL 中的 EXISTS 关键字对于初学者来说是比较难理解的一个,尤其是多个 EXISTS 子句的嵌套.我就写篇小文章,来简单地来解释下 EXISTS 到底做了些什么. 我们先从 SQL 中最基础的 WHERE 子句开始. 比如下面这条 SQL 语句: 很显然,在执行这条 SQL 语句的时候,DBMS 会扫描 Student 表中的每一条记录,然后把符合 Sdept = 'IS' 这个条件的所有记录筛选出来,并放到结果集

AFNetworking到底做了什么?

前言 作为一个iOS开发,也许你不知道NSUrlRequest.不知道NSUrlConnection.也不知道NSURLSession...(说不下去了...怎么会什么都不知道...)但是你一定知道AFNetworking. 大多数人习惯了只要是请求网络都用AF,但是你真的知道AF做了什么吗?为什么我们不用原生的NSURLSession而选择AFNetworking? 本文将从源码的角度去分析AF的实际作用. 先从最新的AF3.x讲起吧: 首先,我们就一起分析一下该框架的组成. 将AF下载导入工

「01」机器学习,到底在学些什么?

阅读 0 编辑文章 大家好,欢迎来到久违的机器学习系列,这是「美团」算法工程师带你入门机器学习 专栏的第一篇文章,不会太长,一半聊想法,一半聊干货.熟悉我的朋友可能知道,我以前的文章比较随意,涉及的内容极广,包括但不限于Python/Java/C/C++,网络编程,Hadoop等,但主要核心还是机器学习算法和数据科学相关的主题,这一点没变过. 最近认真总结和思考了之前的博客内容,决定将自己从入门到现在一路走来的学习经验和理解整理一番,帮助更多后来的小伙伴更好的入门,所以就有了这个系列.以前的知乎

关于driver_register做了些什么

现在进入driver_register()函数去看看.在driver_register() 中,调用了driver_find(drv->name, drv->bus)函数,这里是干啥呢?这里是先去驱动打算挂牌的地方先查找一下,这个驱动是否已经挂牌(注册)过了.在哪里查找呢?代码中写得很清楚,去bus->p->drivers_kset中查找,看到这里,我决定这里不要再继续展开细细的分析,否则永远都无法把内核看明白,有时候必须对细节很了解,有时候只要明白他的工作原理就可以,不必太细碎.

一张图告诉你广电总局这些年都做了些什么~

广电总局,那些年的禁令!国家新闻出版广电总局是国务院直属机构,我们最熟悉的莫过于电影开场时必然会出现的金色龙形长城标志.那么,一张图,让你看清广电总局这些年做了什么事…… 一张图告诉你广电总局这些年都做了些什么-,布布扣,bubuko.com

罗永浩到底做错了什么?

老罗的锤子一直以来都是不温不火,最近给别人都有"卖身阿里"的感觉了,和雷军的小米等其他国内手机品牌厂商相比,老罗还是挺失败的,为什么老罗的锤子卖不动呢? 今天企业纽带线CRM系统小编要跟大家聊的是罗永浩到底做错了什么. 1:把情怀估值太高----附加值变现时机太早 3000多到2000,情怀怎么也值1000吧? 错!情怀是要包裹在"性价比""占便宜""投资少回报大"的包装里才能出售的. 不然你多新鲜的情怀,多有机无害非转基因的

open_window()到底做了什么?

1 Hlong MainWndID= (Hlong)m_hWnd; 2 open_framegrabber("File", 4, 4, 0, 0, 0, 0, "default", -1, "default", -1, "default", 3 "", "default", -1, -1, &AcqHandle); 4 grab_image(&Image, AcqHand