对malloc使用的一点新理解

本文总结了使用malloc和free函数时应注意的事项,包括避免重复free、跨进程分配与释放的问题、指针长度超出申请范围等常见错误,并提供正确使用示例。

昨日在子函数中用malloc申请内存使用后,意外发现在free的时候出现异常错误,后经检查发现原来是实际使用时指针长度超过了申请的范围。

现总结一些使用malloc时要注意的地方:

1,不要Free二次,配套使用。否则当free第一次的时候没有问题,第二次的时候就是在free一个野指针了,程序也不知道你到底在free什么东西。
2,不要跨进程分配和释放;    
     不要free多次或0次;   
     注意判断分配是否成功;
3,对于malloc()和f ree()需要注意的,补充一句,为了确保对于一个有效指针只free一次,所以应该在malloc返回失败、free指针以后都因该把指针置空,而在free前应该判断指针是否为空!只要按照这种方式去写代码应该是没问题的!当指针置空后你爱怎么free都没事。
4,在一个函数里边malloc了一个指针,然后返回值是这个指针,也需要free。
5,指向malloc申请的堆内存的指针,在运用过程中千万不要另付值,否则同样导致内存泄露。比如我*p=(char*)malloc(sizeof(char)*100);然后我进行p++,再free(p);这样是会出问题的。free()传入的参数必须是内存段的头指针,如果你给程序的东西不是牛头不对马嘴,它肯定要跟你闹矛盾。
6,malloc后,实际使用时指针长度超过了你申请的范围,当再去free时肯定出问题!其实很好理解,你申请了十块大洋,你买不了十一块大洋的东西。
 
其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:

 1 // Code...
 2 char *Ptr = NULL;
 3 Ptr = (char *)malloc(100 * sizeof(char));
 4 
 5 if (NULL == Ptr)
 6 {
 7 exit (1);
 8 }
 9 
10 gets(Ptr);
11 
12 // code...
13 
14 
15 free(Ptr);
16 
17 Ptr = NULL;
18 
19 // code...

 

最后贴上昨天在知乎给遇到相同问题的同学的解答:

转载于:https://www.cnblogs.com/Aggressssif/p/5940865.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值