- 论坛徽章:
- 0
|
一。malloc
1。需要动态分配空间,一般用malloc来申请。申请空间后,要对空间进行初始化,一般置空。
例:p=(unsigned char *)malloc(30);
2.申请以后,要对申请的空间进行判断是否为NULL
例:if(p==NULL) {}
3.还要对申请的空间初始化
例:memset( p, 0,sizeof(p));
二。free
1.对malloc的空间,要用对应的free来释放
例:free(p);
2.对释放的空间的地址要指向NULL,以避免产生“野指针”
例:p=NULL;
三。总结及注意
1.用到的空间是否越界
2.释放的空间和申请的空间是同一空间
这一点尤其要注意,在应用程序执行的过程中可能会使指向初始化的空间的指针指向别处,也就是指针移位,尤其对一些局部变量,当局部变量自动释放后,指针还在指向那块地址,并且用free去释放那块地址,这是很危险的,可能表现在下一次malloc时core dump;也有可能一个指针多次malloc,但只free一次,必然造成一定的内存泄漏。
3.必要的时候,可以把申请的空间和释放的空间地址打印出来以跟踪整个流程,%s打印内容,%d打地址
例:printf( "p=[%s],p=[%d]\n",p,p);
4.注意分清数组和指针的分配方式,生存期。如要做内容的复制,分析下面两句:
例:char string1[10]="sss";
p=string1;
或p="www";
以上两句都使指针指向临时变量,虽然内容可以拷贝进去,但是这样free(p)时就会发生潜在的错误,直到程序运行起来才会发生不可预知的错误,最突出的是core dump。所以在代码编写的过程中一定要把这些杜绝,尤其是多次循环时,core dump的出现会让人头疼万分。
以上系个人心得,希望大家补充讨论! |
|