C指针(二) - 内存泄露杯具现场及对策

一、未经初始化的内存

【杯具现场】

     指针P申请了10字节的内存空间,但是没有对该内存进行初始化,我们称这块未经初始化内存为垃圾内存(JUNK),因为里面装有不确定的值。如果其他代码不小心使用了这块内存,离奇的杯具就上演了。
char *p = malloc ( 10 );

 【应对方法】
char *p = malloc (10); memset(p,'/0',10);  

 

 

让memset在申请内存后使用。或者直接使用calloc。

注意:malloc 和 calloc的区别,调用成功后,这两个函数都返回申请内存的首地址。区别是calloc对这片内存初始化为'/0'(如果是指针则被初始化为空),而malloc没有对这片内存进行初始化。

 

 

二、内存越界

【杯具现场】--- 写越界

char *name = (char *) malloc(11); // Assign some value to name memcpy ( p,name,11); // Problem begins here  

【应对方法】

注意读写区域间内存大小是否匹配。

 

 

【杯具现场】--- 读越界

char *ptr = (char *)malloc(10); char name[20] ; memcpy ( name,ptr,20); // Problem begins here  

【应对方法】

注意读写区域间内存大小是否匹配。

 

三、内存泄露

【杯具现场】--- 申请内存的指针转移指向

      分别为MemoryArea和NewArea分配10字节的内存空间。然后将MemoryArea指向了NewArea。这样的行为使MemoryArea原来所指向的内存区域成了孤魂野鬼,无法再用MemoryArea释放它。

 

C指针(二) - 内存泄露杯具现场及对策_第1张图片

 

 

 

 

C指针(二) - 内存泄露杯具现场及对策_第2张图片

 

 

【应对方法】

转移指针指向时,要保证被操作的指针原来未关联内存区域。

 

【杯具现场】--- 相关联的指针过早被释放

  memoryArea指针所指的第3个内存空间(NewArea指针)指向了另一块内存空间。这时如果先释放memoryArea的内存,那么NewArea所指向的空间就会变成孤魂野鬼,无法再用MemoryArea释放它。


 
free(memoryArea)  
【应对方法】
free( memoryArea->newArea); free(memoryArea);  

 

 

 

四、错误处理返回值

【杯具现场】

在func 中申请的内存后,返回了改内存的引用,但是在callingFunc 中没有处理func返回的引用进行内存释放。
char *func ( ) { return malloc(20); // make sure to memset this location to '/0' } void callingFunc ( ) { func ( ); // Problem lies here }

【应对方法】

在callingFunc 函数中,对func 返回的指针进行处理。

五、访问野指针

 

 

 

 参考 http://www.ibm.com/developerworks/aix/library/au-toughgame/

 

你可能感兴趣的:(c)