1.坚持下列措施可以避免内存越界:
? 数组的大小要考虑最大情况,避免数组分配空间不够。
? 避免使用危险函数sprintf /vsprintf/strcpy/strcat/gets操作字符串,使用相对安全的函数snprintf/strncpy/strncat/fgets代替。
? 使用memcpy/memset时一定要确保长度不要越界
? 字符串考虑最后的’\0’, 确保所有字符串是以’\0’结束
? 指针加减操作时,考虑指针类型长度
? 数组下标进行检查
? 使用时sizeof或者strlen计算结构/字符串长度,避免手工计算
2.坚持下列措施可以避免内存泄漏:
? 异常出口处检查内存、定时器/文件句柄/Socket/队列/信号量/GUI等资源是否全部释放
? 删除结构指针时,必须从底层向上层顺序删除
? 使用指针数组时,确保在释放数组时,数组中的每个元素指针是否已经提前被释放了
? 避免重复分配内存
? 小心使用有return、break语句的宏,确保前面资源已经释放
? 检查队列中每个成员是否释放
3.坚持下列措施可以避免引用已经释放的内存空间:
? 内存释放后,把指针置为NULL;使用内存指针前进行非空判断。
? 耦合度较强的模块互相调用时,一定要仔细考虑其调用关系,防止已经删除的对象被再次使用。
? 避免操作已发送消息的内存。
? 自动存储对象的地址不应赋值给其他的在第一个对象已经停止存在后仍然保持的对象(具有更大作用域的对象或者静态对象或者从一个函数返回的对象)
4.使用线程池机制,避免线程频繁创建、销毁的系统调用;使用内存池,对于频繁申请、释放的小块内存,一次性申请一个大块的内存