[整理]内存动态分配

1.不要直接调用malloc
void *malloc(unsigned int num_bytes);

malloc函数的工作机制
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。

2.realloc
void *realloc(void *mem_address, unsigned int newsize);

先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头
到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块
的地址。

3.calloc
void *calloc(size_t n, size_t size);

calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

但是ANSI C并不保证0值与浮点0或空指针的值相同。

4.alloca
有的C编译器提供了alloca函数,与malloc的区别在于它是在堆栈上分配内存。和自动变量一样,会自动释放内存。

[整理]内存动态分配,布布扣,bubuko.com

时间: 2024-08-24 18:49:25

[整理]内存动态分配的相关文章

[整理]内存重叠之memcpy、memmove

函数原型: void *memcpy( void *dest, const void *src, size_t count ); void *memmove( void* dest, const void* src, size_t count );  1.memcpy和memmove相同点都是用于从src拷贝count个字节到dest. 2.memcpy和memmove区别如果目标区域和源区域有重叠的话:memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖.memmove能够保证源串在被覆盖之

使用malloc和free函数进行内存动态分配

一.在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来进行分析 1 #include <stdio.h> 2 #include <malloc.h> 3 int main(void) 4 { 5 int a[5] = {4, 10, 2, 8, 6}; 6 int len; 7 printf("请输入数组的长度大小:len= &

内存动态分配与释放

内存的动态分配需要使用函数malloc,函数free和运算符sizeof来实现.函数malloc的原型是: Void* malloc(unsigned int size); 函数malloc的作用是在内存中分配一个长度为size的连续存储空间.函数的返回值是一个指向分配空间的起始位置的指针.如果分配空间失败,则返回NULL.如果要为类型为struct node的结构体分配一块内存空间.可以使用以下语句来实现: p=(struct node*)malloc(sizeof(struct node))

知识整理--内存

. C语言内存分布图 . 什么是堆和栈,它们在哪儿? . 上文原文 . 局部变量.全局变量.堆.堆栈.静态和全局 . C++内存管理 . c语言 动态分配内存 . 32位系统最大只能支持4GB内存之由来

内存动态分配之realloc(),malloc(),calloc()与new运算符

1,malloc与free是C/C++的标准库函数,new/delete是C++的运算符,是C++面向对象的特征,它们都可用于申请动态内存和释放内存.2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 3,因此C++语言需要一个能完成动态内存分配和初始化工作的

内存动态分配管理

1 /********************************************** 2 * 内存管理测试 3 **********************************************/ 4 #include "includes.h" 5 #define TASK_STK_SIZE 512 //任务堆栈长度 6 7 /******任务堆栈*********/ 8 OS_STK TaskStartStk[TASK_STK_SIZE]; //任务堆栈区 9

memcached整理の内存管理及删除机制

内存的碎片化 如果用C语言直接malloc,free来向操作系统申请和释放内存时,在不断申请和释放的过程中,形成了一些很小的内存判断,无法再利用.这种空闲但无法利用内存的现象称为内存的碎片化. slab allocator 缓解内存碎片化 memcached用slab allocator机制来管理内存. slab allocator原理:预告把内存划分成数个slab class仓库(每个 slab class 大小为1M),各仓库切分成不同尺寸的chunk块,需要存内容时,判断内容大小,然后选取

堆内存动态分配情况和jvm调优方向

由上图可以看出: 堆中分为新生代(占堆1/3内存)和老年代(占堆2/3内存), 新生代又分为Eden区(占新生代内存的8/10)和survivor区(占新生代内存的2/10), survivor区又分为from区和to区(各占新生代内存的1/10) 我们知道new出来的对象都是方在堆里面,那么具体在堆里面是怎么样的呢? 1.刚开始new出来的对象放在Eden区 2.等到Eden放满之后,就会进行一次minor gc,清除无效对象并将存活的对象移入from区(第一次minor gc),Eden又可

内存动态分配