c语言中动态内存常用到4个函数
malloc 原型void * malloc(size_t size);
用于动态开辟size大小的空间。
calloc 原型void *calloc(size_t num,size_t size);
用于对已开辟的数组元素初始化为0
num为数组中元素个数,size为每个元素的字节长度
realloc 原型void*realloc(void *memblock,size_t size);
用于对已开辟好的动态内存重新修改大小
membloc是以前动态开辟的内存块,size是重新开辟的内存大小
free 原型void free(void *memblock);
用于释放动态开辟的内存
memblock是以前动态开辟的内存
这几个函数用于在堆上动态开辟内存,由于对空间不属于操作系统自动管理,所以这段内存的开辟和释放都需要我们自行管理。
在这里常常会出现以下几个问题
(1)忘记free
忘记释放内存会让程序在为结束时一直占用堆内存,影响性能;
(2)指向malloc申请内存的指针指向被修改,造成free时的程序崩溃
#include<malloc.h>
#include<stdio.h>
int main()
{
#define LNE 10
int *arr = (int *)malloc(sizeof(int)*LEN);
arr++;
free(arr);
return 0;
}
上述代码为了演示free掉一个改变申请时位置的指针,arr改动较为简单。但在程序编写过程中,我们常常对malloc申请的数组进行改值,又是不可避免的要改动指针,所以在改动时不妨添加一个指针变量指向arr。
(3)悬挂指针(也叫悬空指针)
悬挂指针指的是free后的指针未作处理。如上面代码中的arr。虽然arr动态开辟空间,又正常归还,但是如果在以后的代码中使用arr指针依然可能会出现问题。因为此时arr指向的空间已被释放,无法通过arr访问任何空间,所以一般为了规避这个问题,会在free后直接将arr置空,说明arr是一个“没人要的孩子”。
(4)重复释放同一片内存