一、未经初始化的内存
【杯具现场】
指针P申请了10字节的内存空间,但是没有对该内存进行初始化,我们称这块未经初始化内存为垃圾内存(JUNK),因为里面装有不确定的值。如果其他代码不小心使用了这块内存,离奇的杯具就上演了。
【应对方法】
让memset在申请内存后使用。或者直接使用calloc。
注意:malloc 和 calloc的区别,调用成功后,这两个函数都返回申请内存的首地址。区别是calloc对这片内存初始化为'/0'(如果是指针则被初始化为空),而malloc没有对这片内存进行初始化。
二、内存越界
【杯具现场】--- 写越界
【应对方法】
注意读写区域间内存大小是否匹配。
【杯具现场】--- 读越界
【应对方法】
注意读写区域间内存大小是否匹配。
三、内存泄露
【杯具现场】--- 申请内存的指针转移指向
分别为MemoryArea和NewArea分配10字节的内存空间。然后将MemoryArea指向了NewArea。这样的行为使MemoryArea原来所指向的内存区域成了孤魂野鬼,无法再用MemoryArea释放它。
【应对方法】
转移指针指向时,要保证被操作的指针原来未关联内存区域。
【杯具现场】--- 相关联的指针过早被释放
memoryArea指针所指的第3个内存空间(NewArea指针)指向了另一块内存空间。这时如果先释放memoryArea的内存,那么NewArea所指向的空间就会变成孤魂野鬼,无法再用MemoryArea释放它。
【应对方法】
四、错误处理返回值
【杯具现场】
在func 中申请的内存后,返回了改内存的引用,但是在callingFunc 中没有处理func返回的引用进行内存释放。
【应对方法】
在callingFunc 函数中,对func 返回的指针进行处理。
五、访问野指针
参考 http://www.ibm.com/developerworks/aix/library/au-toughgame/