malloc calloc recall
一、malloc
1、malloc申请空间,怎么能确定free()一定将申请的字节全部释放呢?
原因:
(1) 有信息头部28字节,在释放的时候向上读取信息,从而确定释放的大小。因此实际申请的空间比申请的大。
(2) 存在下越界,那么在释放的时候遇到下越界则一直释放到那里
2、利用malloc申请的空间越小,其他信息(头部信息28,上越界下越界8,)耗费大。当malloc(0),并不会返回空指针,其他信息占用100%。
3、malloc中容易出现的错误:
(1)没有对申请到的空间进行判空,malloc申请的空间必须判空
(2)并没有通过malloc申请堆区的空间,就不需要释放
(3) 释放两次空间,会造成程序的崩溃
(4) 对于申请到的堆区的地址不能加一,否则会造成下越界,并且,使得下越界的部分到头部信息。
(5) 申请空间后,地址指向后会造成越界,应该是
for(int i=0;i<n;i++)
(6) 不仅范围造成地址下越界,而且指针地址加一,造成下越界
(7)死循环会造成堆区空间被耗尽
4、malloc申请内存失败的原因:
(1)内存不足
如果申请不了,则内存不足,如何解决内存不足?
(2)在前面的程序中出现了内存越界的情况,导致malloc()分配函数所涉及的信息被破坏,那么下次使用malloc()申请空间就会失败,从而返回空指针
二、calloc
malloc与calloc相同点都是在堆区申请空间,但是malloc申请到空间之后是以“cd cd cd ……”来进行填充的,而calloc则是对开辟的空间初始化为0
三、recall(重新分配内存块)
它必须是在malloc或者calloc内存并未释放的基础上进行的。
三中修改情况:
(1)当未分配内存空间足够大,直接在先前空间的后面增加新的空间
(2)未分配空间不足,重新申请一块新扩增大小的空间,将之前的值转移到新的空间,并释放原来的值。
(3)堆内存不足,扩展空间失败
在申请空间失败的时候,会返回空值赋给原来的指针,那么此时会造成内存泄漏。改进方法:
此外,如果将ip指针变为空指针,也是可以实现的,那么此时的
int* newdata=(int*)recall(ip,sizeof(int)n);
等价于:
//int newdata=(int*)malloc(sizeof(int)*n)
对于内存的收缩则不存在系列问题
注意:
free(ip)释放一次即可,释放两次程序异常
free一定要置为空,不然存在概率性事件使得程序崩溃。