常见的内存错误及其对策


  • 发生内存错误,编译器不能发现这些错误,在程序运行时才能捕捉到。而且时有时无
  • 内存分配未成功,确使用了它

    • 产生原因: 内存不足。
    • 解决办法:在使用内存之前检查指针是否为null,如果指针p是函数形参,那么在函数的入口处用**断言:**assert(p!=null);这个语句的作用,如果p!=null,则通过。如果new/malloc,应该用if(p==null),进行预防处理。
  • 内存分配成功,但是未初始,就引用它
    • 产生原因:

      • 没有初始化的概念
      • 误以为内存的缺省初值全为0(内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有)。
    • 解决办法:无论用何种方式创建数组,都被忘了赋初值,即使赋0值也不可省略。
  • 内存分配成功并且已经初始化,但是操作越过了内存的边界
    • 产生原因:在使用数组时经常发生下标多一或者少一的操作。特别是在for循环中。
    • 解决办法:小心仔细。
  • 忘记释放内存,造成内存泄露
    • 产生原因: 忘记free,忘记delete。
    • 造成的影响: 这种错误,每发生一次,就丢失一块虚拟内存(内存泄露),但是当虚拟内存耗尽时, 程序会突然死掉。
    • 解决办法:小心仔细,或者自己写一个方法,登记程序中动态申请的所有内存,然后根据需要释放。
  • 释放了内存却继续使用它
    • 产生原因:

      • 程序中的对象调用关系过于复杂,难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。
      • 函数return语句写错了,注意不要返回指向“栈内存”的指针或者引用,因为该内存在函数体结束时理论上被自动销毁。
      • 使用free或者delete释放了内存后,没有将指针设置为null,导致产生野指针。
    • 解决办法:
      • 防止操作空指针:用malloc或者new申请内存之后,应该立即检查指针是否为null。
      • 防止将未初始化的内存作为右值使用:不要忘记为数组和动态内存赋初值。
      • 防止数组越界。
      • 防止内存泄露:malloc和free,new和delete配对。
      • 防止产生野指针:用free和delete释放内存后,立即将指针设置为null。

出现段错误的6中情况


  • 操作非法指针,指针未初始化或者释放内存之后再次访问。
  • 操作NULL指针。
  • 修改常量区中的内容。char *p = "helloworld";p[1]=a;
  • 数组越界(并非数据越界一定会报错)。
  • 多次释放同一块内存。
  • 跨进程访问某个地址。

常见的内存错误(段错误)及其对策相关推荐

  1. linux内存不足+段错误,Linux系统内存错误产生的原因及调试方法(段错误|core dumped)[转]...

    产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来 ...

  2. c语言 memset 段错误,段错误之memset对类对象的误用

    1.问题描述 实际项目中,定义一个如下的基类和子类,均包含有虚函数. //基类 class OriginalTask { public: OriginalTask() {}; virtual ~Ori ...

  3. 常见动态内存的管理程序错误

    三种常见的程序错误与动态内存分配相关: 1. 删除(delete)指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区.删除动态分配内存失败称为"内存泄漏(memory leak) ...

  4. linux内存不足+段错误,在linux下代码运行出现段错误,求大神

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include #define PATH1 "/proc/meminf ...

  5. 内存泄漏、内存溢出、内存越界、段错误、堆溢出、栈溢出

    内存泄露 内存泄漏(memory leak)是应用程序分配某段内存后,由于疏忽或者错误,失去了对该段内存的控制,因而造成了内存的浪费. 或者可以说向系统申请分配内存进行使用(new),但是用完后不归还 ...

  6. 常见Android Native崩溃及错误原因

    作者介绍:王竞原,负责网游刀锋铁骑项目,使用C++10年左右,非常喜欢使用C++,特别是C++11.希望能与广大的C++爱好者多交流. 一.什么是Android的C/C++ NativeCrash A ...

  7. 段错误(核心已转储)的原因

    一.什么是段错误? 一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 segmentation fault 就出现了,通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不 ...

  8. C语言再学习 -- 段错误(核心已转储)

    参看:Linux下的段错误产生的原因及调试方法 参看:Linux环境下段错误的产生原因及调试方法小结 参看:维基百科--Segmentation fault 参看:LINUX内核段错误调试详细指南精品 ...

  9. LINUX 段错误查找记录 -- segfault at fffffffffffffff9 ip 0000003c97e7b81c sp 00007fffad7c0638 error 4 in lib

    119.*.*.45 app 总是段错误, 且不产生core文件(ulimit -c unlimited 设置) grep segfault /var/log/messages Oct 31 17:3 ...

最新文章

  1. 转:秒杀系统架构分析与实战
  2. DeepMind、哈佛造出了 AI「小白鼠」,从跑、跳、觅食、击球窥探神经网络的奥秘...
  3. 德州仪器Q2净利7.79亿美元 营收32.7亿美元
  4. 可通过http获取远端服务信息_微服务基础——厉害了!API网关
  5. 获取现成的参考文献格式方法
  6. Redis Sentinel配置小记
  7. Java编程思想 学习笔记1
  8. 数据结构与算法分析(七)——C++实现平衡二叉树
  9. 为什么修电脑的叫自己不要杀毒和清理垃圾?
  10. 鸿蒙如何连接电视,鸿蒙系统首秀,在自家设备上和普通电视大不相同
  11. Http client to POST using multipart/form-data
  12. 随机函数_巧用随机函数,生成各种姓名组合。
  13. IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址和子网掩码相加得到的网络地址是什么意思
  14. html显示器对象属性,Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转...
  15. XYNUOJ Six Degrees of Separation
  16. 11月18日——离noip还有1天[游戏王YGO]
  17. Ajaxfileupload上传多张图片
  18. 解决IE浏览器没有网络的情况
  19. 企业绿色创新转型-2002-2020工业企业科技创新指标汇总
  20. google源码下载方法

热门文章

  1. Unity动漫游戏集合
  2. . NET C# WPF图书管理系统源码 .net C# WPF图书管理系统源码
  3. 从消费者观点看“服务”产品
  4. fail2ban帮助postfix过滤恶意IP
  5. office2007中公式编辑器
  6. 2021年焊工(初级)复审考试及焊工(初级)实操考试视频
  7. OS + Linux RedHat / redhat 5 / redhat 6 / redhat 7
  8. dd通过网络克隆硬盘或者备份
  9. 被路由器拉黑了怎么解除?
  10. Oracle数据库安装先决条件检查失败解决方案