项目场景:
内存的申请和释放
问题描述:
程序异常终止,控制台返回值一直为下面的问题,经检查是一句free()语句的问题。
Process returned -1073741819 (0xC0000005)
原因分析:
malloc分配的空间的空间出现了问题,一些标志信息被修改,可能是分配空间打下不够。
经检查,错误在于把sizeof(size)当成了大小,而不是size
解决方案:
删除多余的sizeof()即可
收获
内存的释放和申请一定是成对的,有一个申请就要对应一个释放。
如果是申请了一个结构体的内存,又用这个结构体内的指针申请了一片内存,则释放时后者也要释放而且还要先释放。不释放后者的话程序可能可以运行,但会有内存泄漏,软件所占内存越来越大。
以codeblocks运行为例,都释放的话一个程序一直稳定在12.5M左右:
而如果,不释放后分配的,内存会越来越大,下图是运行几分钟的内存,就已经是原来的4倍了!!!:
从这里也有一个简单的检查内存泄漏的方式,打开任务管理器看程序的内存是不是一直在增大,当运行时间比较长,程序的内存增大的很厉害。
实例代码:
typedef struct frame{
char *data;
int size;
}FRAME,*PFRAME;
PFRAME creat_frame(char* data,int size){
PFRAME pf=(PFRAME)malloc(sizeof(FRAME));
pf->size=size;
pf->data=(char *)malloc(size);
for(int i=0;i<size;i++){
pf->data[i]=data[i];
}
return pf;
}
int main(){
PFRAME data=creat_frame(a,size);
free(data->data);
data->data=NULL;
free(data);
data=NULL;
}
如果想写一个释放结构体的函数,要看是否要改变指针的值确定传的参数是指针的地址还是指针。
特别注意点,一定要检查malloc()中给的是一个size,还是一个size的size(即使用sizeof(size),得到的是一个整数的字节)