有关于malloc申请内存和free内存释放
malloc工作机制:
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表(堆内存)。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
程序占用三种类型的内存:静态内存、栈内存、堆内存;
静态内存:用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量
栈内存:用来保存定义在函数内的非static对象。分配在静态内存或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用之前分配,在程序结束时销毁。
堆内存:在程序运行时分配。动态对象的生存周期由程序(用户)来控制。
关于使用free()函数释放内存后实际数据是否存在的问题
关于用malloc分配的内存,在调用free释放后,该内存的状态,有以下几点说明:
1.调用free释放掉所分配的内存后,表明该内存可以被别人使用,也就是说,其他地方调用malloc后,可以分配到该内存
2.关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者被修改为其他值;
3.在释放了该内存后,除了要对当时分配的指针赋值为NULL,还要注意不要再去引用这部分内存,不要尝试获取这部分的值,这些已经非法。
4.内存free后,里面的数据还是在的,只是这块内存会被标记为可用的内存,别的程序可以用这块内存里面的数据可能存在,只要该内存没有被别的地方占用。你free释放的是内存的使用权。
验证代码:
#include <stdio.h>
#include <stdlib.h> struct stu1{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}; int main(){
//给结构体成员赋值
struct stu1 *stu1;
{
stu1 = malloc(sizeof(struct stu1));
stu1->name = "Tom";
stu1->num = ;
stu1->age = ;
stu1->group = 'A';
stu1->score = 136.5;
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1->name, stu1->num, stu1->age, stu1->group, stu1->score);
printf("%p\n",stu1);
free(stu1);
}
scanf("%p",&stu1);
printf("%p\n",stu1);
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1->name, stu1->num, stu1->age, stu1->group, stu1->score);
return ;
}
有关于malloc申请内存和free内存释放的更多相关文章
- 关于malloc申请的动态内存的问题
http://bbs.bccn.net/thread-331344-1-1.html #include<stdio.h>#include<stdlib.h>int main(v ...
- 【VS开发】malloc申请内存错误分析
每个进程会有4G的虚拟地址空间, malloc得到的的地址都是虚拟地址, 并且当malloc的时候, 操作系统并不会将实际的内存分配给进程的, 所以malloc只会占用进程自身的虚拟地址空间.我以前也 ...
- Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统
Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本 ...
- Win3内存管理之私有内存跟共享内存的申请与释放
Win3内存管理之私有内存跟共享内存的申请与释放 一丶内存简介私有内存申请 通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存 ...
- new与malloc的区别,以及内存分配浅析
从函数声明上可以看出.malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小.比如: 1 2 3 int *p; p = new int; //返回类型 ...
- C++函数中,两个自动释放内存的动态内存申请类
最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请, 而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉, 使用很多方法,都避免不了较多的出错分支时,一堆的if fr ...
- .Net 应用程序如何在32位操作系统下申请超过2G的内存【转】
作者: eaglet 2008 年我写过一篇博客叫 <让.Net 应用程序突破2G的内存访问限制> 这篇博客主要讲述了如何在32位操作系统下利用AWE 扩展访问超过2G的内存.AWE方式虽 ...
- 早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)
今天和同事review代码时,发现这样的一段代码: Manager * pManager = new Manager(); if(NULL == pManager) { //记录日志 return f ...
- 程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)
根据<Windows核心编程>得知:X86操作系统提供每个程序最多只有4G的虚拟内存,其中2G虚拟内存提供给系统用(具体用来干什么还待考察),还有2G的内存留给用户使用.那这2G内存能拿来 ...
随机推荐
- .NET 常用加密、解密& 数字签名算法
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Run ...
- JPA(三):JPA基本注解
基本注解 @Entity 标注用于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表.如声明一个实体类Customer,将它映射到数据的coustomer表上. package co ...
- Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信
Condition: condition接口描述了可能会与锁有关的条件变量.这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个lock可能与多个Co ...
- 快讯:微软安卓版个人助理(Cortana)在美国境内进行公測
8月24日,"Microsoft starts public test of Cortana app for Android smartphones"(此文8月24日发表),此事意 ...
- IT行业简报 2014-2-8
1.微信在“我的银行卡”页面接入嘀嘀打车,三天内微信打车突破10万单,日均订单为70万,其中微信支付订单超过48万单2.三大运营商手机支付用户仅366.3万,与腾讯单月发展手机支付用户500万户相比, ...
- Activity设置为对话框属性时(Theme.Dialog)时,改变其在屏幕中的位置
如果有需要要将Activity变成一个窗口形式(在Manifest.xml中的activity标签设置android:theme="@android:style/Theme.Dialog&q ...
- python抓取数据,python使用socks代理抓取数据
在python中,正常的抓取数据直接使用urllib2 这个模块: import urllib2 url = 'http://fanyi.baidu.com/' stream = urllib2.ur ...
- 编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器)
[目录] 不考虑其他进程,cpu画正弦曲线 获取总体cpu利用率 获取多核处理器单个cpu利用率 考虑其他进程,cpu画正弦曲线 下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文 ...
- linux2.6.30.4内核移植(6)——移植应用程序hello world常见的错误:-bin/sh ./hello not found
通常在开发板上搭建好开发平台后,我们会试着移植一个最简单的应用程序Hello world来测试一下.初次尝试,我们经常会碰到的问题就是,在开发板上运行./hello的时候出错:-bin/sh ./he ...
- SQL Server中获取最新插入的自增ID
SCOPE_IDENTITY()函数 返回的是紧跟这个插入语句生成的自增ID, 若果前一个语句不是插入自增ID的,将返回NULL @@IDENTITY 返回全局的最有一个生成的自增ID,全局可用 cr ...