James Bryant

【转】对malloc使用的一点新理解

0
阅读(1090)

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

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

1,不要Free二次,配套使用。否则当free第一次的时候没有问题,第二次的时候就是在free一个野指针了,程序也不知道你到底在free什么东西。

2,不要跨进程分配和释放; 
     不要free多次或0次; 
     注意判断分配是否成功;

3,对于malloc()和free()需要注意的,补充一句,为了确保对于一个有效指针只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...