摘要:
参数缺省值只能出现在函数的声明中,而不能出现在定义体中 。 阅读全文
摘要:
函数 free 的原型如下: void free( void * memblock ); 为什么 free 函数不象 malloc 函数那样复杂呢? 这是因为指针 p 的类型以及它所指 的内存的容量事先都是知道的,语句 free(p)能正确地释放内存。 如果 p 是 NULL 指针, 那么 free 阅读全文
摘要:
malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。我 们通常记不住 int, float 等数据类型的变量的确切字节数。 例如 int 变量在 16 位系统 下是 2 个字节,在 32 位下是 4 个字节;而 float 变量在 16 位系统下是 4 个字节,在 32 位 阅读全文
摘要:
malloc 返回值的类型是 void *,所以在调用 malloc 时要显式地进行类型转换,将 void * 转换成所需要的指针类型。 阅读全文
摘要:
用 free 或 delete 释放了内存之后,立即将指针设置为 NULL,防止产 生“野指针”。 阅读全文
摘要:
动态内存的申请与释放必须配对,防止内存泄漏。 阅读全文
摘要:
避免数组或指针的下标越界,特别要当心发生“多 1”或者“少 1” 操作。 阅读全文
摘要:
不要忘记为数组和动态内存赋初值。 防止将未被初始化的内存作为右 值使用。 阅读全文
摘要:
用 malloc 或 new 申请内存之后,应该立即检查指针值是否为 NULL。 防止使用指针值为 NULL 的内存。 阅读全文
摘要:
释放了内存却继续使用它。 有三种情况: (1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内 存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。 (2)函数的 return 语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用” , 因为该内存在函数体结束 阅读全文
摘要:
忘记了释放内存,造成内存泄露。 含有这种错误的函数每被调用一次就丢失一块内存。 刚开始时系统的内存充足,你 看不到错误。 终有一次程序突然死掉,系统出现提示:内存耗尽。 动态内存的申请与释放必须配对,程序中 malloc 与 free 的使用次数一定要相同,否 则肯定有错误(new/delete 同 阅读全文
摘要:
内存分配成功并且已经初始化,但操作越过了内存的边界。 例如在使用数组时经常发生下标“多 1”或者“少 1”的操作。 特别是在 for 循环语 句中,循环次数很容易搞错,导致数组操作越界。 阅读全文
摘要:
内存分配虽然成功,但是尚未初始化就引用它。 犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值 全为零,导致引用初值错误(例如数组)。 内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。 所以无论用何种方式创建数组,都别忘了赋初值,即便是赋 阅读全文
摘要:
内存分配未成功,却使用了它。 编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。 常用解决办法是, 在使用内存之前检查指针是否为 NULL。 如果指针 p 是函数的参数,那么在函数的入口 处用 assert(p!=NULL)进行检查。 如果是用 malloc 或 new 来申请内存,应该用 阅读全文
摘要:
一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可 能会隐瞒错误。 当进行防错设计时,如果“不可能发生”的事情的确发生了,则要 使用断言进行报警。 阅读全文
摘要:
在编写函数时,要进行反复的考查,并且自问: “我打算做哪些假定?” 一旦确定了的假定,就要使用断言对假定进行检查。 阅读全文
摘要:
在函数的入口处,使用断言检查参数的有效性(合法性)。 阅读全文
摘要:
使用断言捕捉不应该发生的非法情况。 不要混淆非法情况与错误情况 之间的区别,后者是必然存在的并且是一定要作出处理的。 阅读全文
摘要:
用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误 情况。 阅读全文
摘要:
不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内 的变量的有效性,例如全局变量、文件句柄等。 阅读全文