malloc 函数到底做了什么?
请看下面的代码。
猜测结果是什么?编译通过吗?
#include <stdio.h>
#include <stdlib.h> int main()
{
int i = ;
char *ptr = NULL; while(i-- >)
{
ptr = malloc();
printf("%d, %p\n", sizeof(ptr), ptr); } free(ptr);
ptr = NULL; system("pause");
return ;
}
编译通过,0警告。
结果如下:
但是,内存泄露。。。
WARNING: Visual Leak Detector detected memory leaks! ---------- Block 1 at 0x00A64D78: 0 bytes
Visual Leak Detector detected 1 memory leak (36 bytes). Largest number used: 72 bytes. Total allocations: 72 bytes.
为什么?
再看代码。。
#include <stdio.h>
#include <stdlib.h> int main()
{
int i = ;
char *ptr = NULL; while(i-- >)
{
ptr = malloc();
ptr = realloc(ptr, );
printf("%d, %p\n", sizeof(ptr), ptr); } free(ptr);
ptr = NULL; system("pause");
return ;
}
猜猜结果是什么?
内存有泄漏吗?
No memory leaks detected.
没有泄露呀。
如果我把
free(ptr);
ptr = NULL;
两行代码去掉,会不会泄露呢?
答案是也不会。
这完全归功于realloc函数的实现机制。
那么malloc函数到底做了什么??
《操作系统》中讲过malloc申请内存的方式,
这主要是和glibc的内存管理机制有关。glibc中,为每一块内存维护了一个chunk的结构。glibc在分配内存时,glibc先填写chunk结构中内存块的大小,然后是分配给进程的内存。
chunk ------size
p------------ content
在进程释放内存时,只要 指针-4
便可以找到该块内存的大小,从而释放掉。
注:glibc在做内存申请时,最少分配16个字节,以便能够维护chunk结构。
看图:
+-----+
| |----> 这里的数据结构就是保存这块内存有多大之类的信息。
| |
| |----> 你的指针的位置
| |----> 下面是你的数据
malloc 函数到底做了什么?的更多相关文章
- C语言 malloc函数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...
- malloc函数的底层实现你是否清楚
malloc函数的底层实现你是否清楚 说起malloc函数,每个人都能说出它的功能,而且我们经常会用到,那么今天我要说的是关于malloc函数在编译器的底层实现,如果你对它的实现已经很清楚了,那么你可 ...
- C语言中 malloc函数用法
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- AFNetworking到底做了什么?(二)
接着上一篇的内容往下讲,如果没看过上一篇内容可以点这: AFNetworking到底做了什么? 之前我们讲到NSUrlSession代理这一块: 代理8: /* task完成之后的回调,成功和失败 ...
- AFNetworking到底做了什么
写在开头: 作为一个iOS开发,也许你不知道NSUrlRequest.不知道NSUrlConnection.也不知道NSURLSession...(说不下去了...怎么会什么都不知道...)但是你一定 ...
- malloc 函数工作机制(转)
malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...
- 如何实现一个malloc函数
一.概述 1.malloc简介 函数所在头文件:<stdlib.h> 函数原型是:void *malloc (size_t n) 函数功能:在内存的动态存储区中分配一个长度为size的连续 ...
- new到底做了什么?
下面是一个实例化自定义的对象,我们将要对他进行分析 //定义构造函数 function A(){ this.b = 1 //在这个对象里增加一个属性 //不可以拥有返回对象的return语句 } va ...
- Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)
周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博 ...
随机推荐
- [MetaHook] R_SparkStreaks
By hzqst void R_SparkStreaks(vec_t *pos, int count, int velocityMin, int velocityMax) { int i; parti ...
- 20135316王剑桥 linux第十一周课实验笔记
getenv函数 1.获得环境变量值的函数 2.参数是环境变量名name,例如"HOME"或者"PATH".如果环境变量存在,那么getenv函数会返回环境变量 ...
- Thrift搭建分布式微服务(二)
第二篇 连接池 连接池配置,请前往Thrift搭建分布式微服务(一) 下面要介绍的其实不是单一的连接池,应该说是连接池集合.因为它要管理多个Tcp Socket连接节点,每个服务节点都有设置了自己 ...
- mac版beyond compare 4 中对比class文件
http://www.scootersoftware.com/download.php?zz=moreformats 这个网址中没有mac版本的class文件对比的file format.只能自己造了 ...
- 机器学习中的矩阵方法(附录A): 病态矩阵与条件数
1. 病态系统 现在有线性系统: Ax = b, 解方程 很容易得到解为: x1 = -100, x2 = -200. 如果在样本采集时存在一个微小的误差,比如,将 A 矩阵的系数 400 改变成 4 ...
- [AaronYang]C#人爱学不学[6]
不要回头,不要将就,做到这两点,人生就会简单很多幸福很多 --Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 运算符,还有哪些你能学到? 1.1 不安全运算符: si ...
- SQL的主键和外键
SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...
- 设置java jvm(虚拟机) 的内存在大小
package WanWan; public class Test { /** * @param args */ public static void main(String[] args) { // ...
- hdu2444 判断二分图+最大匹配
#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define ...
- Java算法-各种题目总结
1.排列计算 /*[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子 ...