(71)内存分配未成功,却使用了它。
在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
(72) 使用未初始化的指针。
未初始化,因而指向的是无效地址的指针。
例如:
int*p;
*p=12;
指针p在声明时未初始化,指向的是一个随机的内存地址。它可能指向系统栈、全局变量、程序代码区或操作系统。执行*p=12;时程序会不加辨别地试图在p指向的随机位置处写入一个12。这时程序有可能立即崩溃,也可能等上半小时然后崩溃,或者程序另一个部分的数据被悄然破坏而您却浑然不知。可见这种错误非常难于排查。确保指针解引用取出指针指向的地址中的内容之前,所有的指针已被初始化为指向有效地址。
错误代码:
char *p;
strcpy(p,"hello world");
正确代码
char buf[1024];
char *p = buf;
strcpy(p ,"hello world");
(73) 避免数组或指针的下标越界。
(74) 动态内存的申请与释放必须配对,防止内存泄漏。
含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。