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