内存错误一般都是焦聚在c和c++应用程序中,而且它会直接影响到应用程序的稳定性和正确性。这些错误都是源于程序在设计时的bug。这种错误很难重现,难于排除,并且要正确修正要花费高昂的代价。应用程序如果有内存错误定会遭受极大的问题。例如,内存泄漏会导致该应用程序耗尽内存,直接的结果是程序的异常终止。本文的主要目的是在多线程程序中理解富有挑战性的内存错误。

内存错误可以主要分为堆内存错误和栈内存错误。下面是一些主要内存错误:

1. 非法访问堆、栈内存。

2. 内存泄漏。

3. 分配和释放内存配合不当。(allocation/deallocation)

4.  忘记分配内存。

5. 访问没有初始化的堆、栈内存。

6.  越界访问内存。

非法内存访问

这个错误出现在对未分配的或已经释放的内存进行读或写的操作。

例如:

char *pStr = (char *) malloc(25);

free(pStr);

strcpy(pStr, .parallel parogarmming.);  //这里就是非法对已经释放的堆内存进行写操作。

内存泄漏

内存泄漏主要是因为内存分配了但是相应的没有释放对应的内存。假如这种内存泄漏足够多的频繁发生,那么最终会引起应用程序耗尽内存,最终导致程序提前终止(异常终止)。

例如:

char *pStr = (char*) malloc(512);

return ;   //只malloc,而不free

忘记分配内存

这种错误一般发生在对已经被释放的内存进行再次释放。同时也叫做重复释放或双重释放。

例如:

char* pStr = (char*) malloc(20);

free(pStr);

free(pStr);         // 导致非法内存释放。

访问未初始化的内存

这种类型的内存错误主要是发生在读取没有初始化的变量在程序中。

例如:

char  *pStr = (char*) malloc(512);

char  c = pStr[0];   // 这里pStr的值没有初始化。

void func()

{

int a;

int b = a + 4;     //读取的a没有初始化值。

}

为了避免这种错误,通常是采用在使用前(定义时)对变量进行初始化。

跨越栈内存访问

这种错误主要发生在在不同的线程中有线程访问栈内存。

例如:

main()

{

int *p;

/* ------------------- */

CreateThread(., thread #1, .);   //自身拥有的栈

CreateThead(., thread #2, .);

/* -------------------- */

}

Thread #1

{

int q[1024];

p = q;

q[0] = 1;

}

Thread #2

{

*p = 2;          // 栈内存跨越访问

}

最容易避免这种错误的方法是避免保存全局变量的栈地址。

                                              By Naveen Gv

原文:http://cprogramming.com/tutorial/memory_debugging_parallel_inspector.html

如何在你的C/C++代码中避免、发现(修复)内存错误相关推荐

  1. 代码中避免懒加载错误_网站设计中应避免的5大错误

    代码中避免懒加载错误 The design of a website plays an imperative role in creating an effective and impressive ...

  2. WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存

    本内容为翻译微软的官方文档和一些国外的blog的内容,详细这些内容的原文可以参看 http://www.cnblogs.com/virusswb/archive/2009/11/05/1596495. ...

  3. 解决代码中重复的捕获 promise 错误的 try catch 语句

    promise promise 的出现,提供了优雅的异步解决方式,但是,多个连续继发 promise 写法依然繁琐. let promise = new Promise(function(resolv ...

  4. java 内存情况_Java代码中获取运行时内存情况

    在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...

  5. Pytorch:CycleGAN代码中nn.Sequential(*module)处错误:list is not a Module subclass

    问题: pytorch训练模型时,将模型的层layer都放到module列表中: module = [layer1,layer2,layer3....] nn.Sequential(*module) ...

  6. Linux 平台中调试 C/C++ 内存泄漏方法

    由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误.同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果.从历史上看,来自计算机应急响 ...

  7. php中脚本代码开始,从PHP代码中执行shell脚本

    我想要做的就是使用PHP来执行youtube-dl -x --audio-format mp3 "token"并获得以下参数JSON:从PHP代码中执行shell脚本 状态(错误= ...

  8. Windows 任务管理器中的几个内存概念

    我们使用的大部分 PC 是基于 Intel 微处理器的 x86 和 x64 架构计算机. 因此, 我们面对的 windows 避免不了和 Intel 架构有些设计上的契合. 比如接下来要说到的内存管理 ...

  9. 音频开发中常见的四个错误

    以下内容主要为音频开发人员所编写,但同样也能为其他领域并与此相关的开发者带来帮助.在下文当中我将介绍针对开发人员的诊断工具,并分享常见的四个错误以及如何检测问题是否存在并做得更好. 文 / Micha ...

  10. 深入理解linux操作系统中的高端内存

    Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图.   Linux内核地址空间划分 通常32 ...

最新文章

  1. mysql40190_MySQL 内核深度优化
  2. .net的垃圾回收机制[转]
  3. python中math isnan,在python中指定一个变量NaN,不用numpy
  4. redis 3.2.1 centos7
  5. 从零开始学习docker(二十一)service管理
  6. SQL2005结合ROW_NUMBER()高效分页存储过程
  7. 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案
  8. ElasticSearch获取多个文档Multi GET API介绍
  9. javascript 不让成为nan_一张图彻底搞懂JavaScript的==运算
  10. 【Angular专题】——【译】Angular中的ForwardRef
  11. 全球首发!惯性导航导论(剑桥大学)第八部分
  12. html实现省市县选择,jQuery ajax实现省市县三级联动
  13. 联想扬天ACPI\LBAI0100未知设备的处理方法 此驱动为电源管理
  14. 阿泰,水晶报表--掌控对象
  15. 使用Guacamole实现远程桌面控制
  16. 经纪业务部负责人是什么工作
  17. 多元线性回归分析spss结果解读_SPSS--回归-多元线性回归模型案例解析
  18. csgo删除机器人_csgo1v1去除机器人 | 手游网游页游攻略大全
  19. 不得不说,时刻准备着
  20. 【CMU15-445数据库】bustub Project #0:Trie 树实现(C++ Primer)

热门文章

  1. supesite模块学习必备知识收藏
  2. python编写程序,计算某个日期是当年第几天
  3. mysql:ERROR 1366: Incorrect string value:错误解决
  4. HDU 4408 最小生成树计数详细解释
  5. 神经崩塌Neural Collapse
  6. windows 安装FFmpeg
  7. Ansys workbench几何建模- DesignModeler (1)
  8. 如何获取外网IP地址
  9. 软件工程导论笔记(同步更新)(已结束更新)
  10. 【82】PCIe LN协议