使用free掉的内存的危害
1 源码
#include <stdio.h>
#include <stdlib.h> // 编译环境 gcc
int main(void) {
printf("******** free test ********** \n");
printf("sizeof(uint) = %ld \n", sizeof(unsigned int));
unsigned int *pInt = (unsigned int*)malloc(sizeof(unsigned int));
printf("pInt = %p \n", pInt);
pInt[0] = 0x88;
printf("Int1 = %d \n", *pInt);
// free该片内存
free(pInt);
//free以后去读该内存 本质是非法的,不可靠的
printf("pInt = %p \n", pInt);
unsigned int Int2 = *pInt;
printf("Int2 = %d \n", Int2);
//free以后去写该内存 本质是非法的,不可靠的
pInt[0] = 0x88;
pInt[1] = 0x77;
printf("pInt[0] = %d \n", *pInt);
return 0;
//本次实验代码没有暴露出使用free掉的内存的危害。
}
2小结
做了个实验,free以后的内存也可以读写。本次实验代码没有暴露出使用free掉的内存的底危害。
那么使用free掉的内存,程序员再去读写该内存,该操作的底危害在哪里?
关于用malloc分配的内存,在调用free释放后,该内存的状态,有以下几点说明:
1.调用free释放掉所分配的内存后,表明该内存可以被别人使用,也就是说,其他地方调用malloc后,可以分配到该内存。 既然其他地方malloc内存可能也使用了这片内存,所以里面的数据可能会被改写。
2.理解了第一点以后,那么关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者也可能被被修改为了其他值;
由此可见,有很多中可能情况,所以,在释放了该内存后,除了要对当时分配的指针赋值为NULL,还要注意不要再去引用这部分内存,也不要尝试获取这部分的值,这些已经非法。
使用free掉的内存会出现不可预知的结果。同时,如果出错,该错误可能不容易重现。这种是最恐怖的错误。
使用free掉的内存的危害的更多相关文章
- 故意使用free掉的内存的一个实验( 常量区/栈)
故意使用free掉的内存的一个实验 考虑一下两种声明 struct stuff{ char home[10]; int num; char name[10]; }; struct stuff{ cha ...
- Memory Leak(内存泄漏)问题总结(转)
最近听了一些关于Memory Leak(内存泄漏)的seminar,感觉有些收获,所以留个记录,并share给朋友. 1 什么是Memory Leak. Memory Leak是指由于错误或不完备的代 ...
- C++中内存分配详解
转载自51CTO.com http://developer.51cto.com/art/201107/276154.htm 我们都知道,内存基本上分为静态存储区.堆区和栈区三大部分 ...
- JVM体系结构-----深入理解内存结构
一.概述 内存在计算机中占据着至关重要的地位,任何运行时的程序或者数据都需要依靠内存作为存储介质,否则程序将无法正常运行.与C和C++相比,使用Java语言编写的程序并不需要显示的为每一个对象编写对应 ...
- 13.缓存、三级缓存、内存溢出、AsyncTask
SharePreference工具类 /** * SharePreference封装 * */ public class PrefUtils { public static final String ...
- Android为TV端助力 转载:内存泄露与内存溢出的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...
- 5.JVM的内存区域划分
一.JVM介绍 1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟 ...
- java内存泄漏与内存溢出
https://www.cnblogs.com/panxuejun/p/5883044.html 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out o ...
- 内存溢出和内存泄漏的区别(ZZ)
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出 ...
随机推荐
- 做SEO必须制定超越竞争对手网站的方案
http://www.wocaoseo.com/thread-131-1-1.html 从开始终学习SEO技术,到现在半年过去了,其间也做了几个站,可是赚钱的并不多,有流量的也不多,虽然说 ...
- springMVC使用JSR303数据校验
JSR303注解 hibernate validate是jsr 303的一个参考实现,除支持所有的标准校验注解外,他还支持扩展注解 spring4.0拥有自己独立的数据校验框架,同时支持jsr 303 ...
- 建设开发者生态:6项华为API管理原则落地
摘要: 为了向开发者提供良好.一致.稳定的华为API的体验,华为通过明确“API管理六项原则”,来支持开发者生态建设. 一个不开放的组织,会慢慢成为一潭僵水,一个封闭的系统,能量最终会耗尽,在产品开发 ...
- js获取N天后的日期
这个javascript函数是获取当前时间前后N天日期的方法,可以得到昨天,今天,明天,一月前,三月前,半年前,一年前的日期,只要修改参数就可以实现得到任何一个天数.具体用法如下: function ...
- JDBC | 第七章: JDBC数据库连接池使用
概述 数据库连接池是负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个.那么其中的运行机制又是怎样的呢?今天主要介绍一下数据库连接池原理和常用的连接池. ...
- Nodejs模块:fs
/** * @description fs模块常用api */ // fs所有的文件操作都是异步IO,如果要以同步的方式去调用,都会加一个在原同步api的基础上加Sync // 同步的方式会在最后传入 ...
- 长沙做假证u
长沙做假证[电/薇:187ヘ1184ヘ0909同号]办各类证件-办毕业证-办离婚证,办学位证书,办硕士毕业证,办理文凭学历,办资格证,办房产证不. 这是一个简单的取最大值程序,可以用于处理 i32 数 ...
- SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign
1.Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的-套客户端―负载均衡的工具. 简单的说,Ribbon是Netlix发布的开源项目,主要功能是提供客户端的 ...
- springboot +jsp项目打包部署到华为云服务器
注:打包之前先保证你的项目本地运行没问题. 一.打包 打包有两种方式,打成jar包和打成war包.因为springboot有内置的服务器,所以选择打成jar包,这样云服务器就不用装tomcat了. 打 ...
- 利用ANSI转义序列在控制台输出彩色文字
说明:无论什么语言,只要你的终端能够解释ANSI转义序列(大多数的类unix终端仿真器都能够解释ANSI转义序列,win32控制台则不支持),就能够使用ANSI转义序列输出颜色.这个功能看似鸡肋,但只 ...