C++|常见的内存错误及解决方法

常见的内存错误 1 内存分配未成功,却使用了它
解决方法
在使用内存之前检查指针是否为NULL?

  • 如果指针p是函数的参数,那么在函数的入口处用assert(p != NULL)进行检查。
  • 如果是用malloc()或new来申请内存,应该用if(p == NULL)或if(p != NULL)进行防错处理。
2 内存分配虽然成功,但是尚未初始化就引用它
【C++|常见的内存错误及解决方法】解决方法
  • 声明后先初始化为0。
  • 在真正使用指针之前,一定使其指向某个地址。要么取某个变量的地址,或者指向链表的头节点。
3 内存分配成功并且已经初始化,但操作越过了内存的边界
解决方法
  • 使用数组下标(或者指针)时要判断是否超过数组长度。
4 忘记了释放内存,造成内存泄露
造成问题
  • 含有这种错误的函数每被调用一次就丢失一块内存。过一段时间系统就会出现提示:内存耗尽
解决方法
  • malloc与free(new/delete)成对使用。
  • 申请空间时就考虑、什么时候释放该空间。
5 释放了内存却继续使用它
有三种情况:
(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时就应该重新设计数据结构,从根本上解决对象管理的混乱局面。
(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
(3)使用free或delete释放内存后,没有将指针设置为NULL,导致产生“野指针”;
内存管理的规则 通过上面的5种错误描述,先总结如下:
  • 用malloc之后,应该立即检查指针值是否为NULL,防止使用指针值为NULL的内存。
  • 不要忘记为数组和动态内存赋初值,防止将未被初始化的内存作为右值使用。
  • 避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
  • 动态内存的申请与释放必须配对,防止内存泄露。
  • 用free释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

    推荐阅读