free()一直失败,程序异常终止

项目场景:

内存的申请和释放


问题描述:

程序异常终止,控制台返回值一直为下面的问题,经检查是一句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),得到的是一个整数的字节)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值