【杯具现场】
指针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释放它。
【应对方法】
转移指针指向时,要保证被操作的指针原来未关联内存区域。
【杯具现场】--- 相关联的指针过早被释放
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/