常见的内存错误
1 内存分配未成功,却使用了它
解决方法
在使用内存之前检查指针是否为NULL?
- 如果指针p是函数的参数,那么在函数的入口处用assert(p != NULL)进行检查。
- 如果是用malloc()或new来申请内存,应该用if(p == NULL)或if(p != NULL)进行防错处理。
【C++|常见的内存错误及解决方法】解决方法
- 声明后先初始化为0。
- 在真正使用指针之前,一定使其指向某个地址。要么取某个变量的地址,或者指向链表的头节点。
解决方法
- 使用数组下标(或者指针)时要判断是否超过数组长度。
造成问题
- 含有这种错误的函数每被调用一次就丢失一块内存。过一段时间系统就会出现提示:内存耗尽
- malloc与free(new/delete)成对使用。
- 申请空间时就考虑、什么时候释放该空间。
有三种情况:
(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时就应该重新设计数据结构,从根本上解决对象管理的混乱局面。
(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
(3)使用free或delete释放内存后,没有将指针设置为NULL,导致产生“野指针”;
内存管理的规则 通过上面的5种错误描述,先总结如下:
- 用malloc之后,应该立即检查指针值是否为NULL,防止使用指针值为NULL的内存。
- 不要忘记为数组和动态内存赋初值,防止将未被初始化的内存作为右值使用。
- 避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
- 动态内存的申请与释放必须配对,防止内存泄露。
- 用free释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
推荐阅读
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 【C】题目|【C语言】题集 of ⑥
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- c语言|C语言初期学习遇到的特殊点 【三子棋详解】【初学者福音,详细总结,复习能手】
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- 个人日记|K8s中Pod生命周期和重启策略
- 个人理解|【C语言基础之类型转换】
- c语言|【C语言】自定义类型 结构体 枚举 联合