如何在你的C/C++代码中避免、发现(修复)内存错误
内存错误一般都是焦聚在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++代码中避免、发现(修复)内存错误相关推荐
- 代码中避免懒加载错误_网站设计中应避免的5大错误
代码中避免懒加载错误 The design of a website plays an imperative role in creating an effective and impressive ...
- WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存
本内容为翻译微软的官方文档和一些国外的blog的内容,详细这些内容的原文可以参看 http://www.cnblogs.com/virusswb/archive/2009/11/05/1596495. ...
- 解决代码中重复的捕获 promise 错误的 try catch 语句
promise promise 的出现,提供了优雅的异步解决方式,但是,多个连续继发 promise 写法依然繁琐. let promise = new Promise(function(resolv ...
- java 内存情况_Java代码中获取运行时内存情况
在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...
- Pytorch:CycleGAN代码中nn.Sequential(*module)处错误:list is not a Module subclass
问题: pytorch训练模型时,将模型的层layer都放到module列表中: module = [layer1,layer2,layer3....] nn.Sequential(*module) ...
- Linux 平台中调试 C/C++ 内存泄漏方法
由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误.同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果.从历史上看,来自计算机应急响 ...
- php中脚本代码开始,从PHP代码中执行shell脚本
我想要做的就是使用PHP来执行youtube-dl -x --audio-format mp3 "token"并获得以下参数JSON:从PHP代码中执行shell脚本 状态(错误= ...
- Windows 任务管理器中的几个内存概念
我们使用的大部分 PC 是基于 Intel 微处理器的 x86 和 x64 架构计算机. 因此, 我们面对的 windows 避免不了和 Intel 架构有些设计上的契合. 比如接下来要说到的内存管理 ...
- 音频开发中常见的四个错误
以下内容主要为音频开发人员所编写,但同样也能为其他领域并与此相关的开发者带来帮助.在下文当中我将介绍针对开发人员的诊断工具,并分享常见的四个错误以及如何检测问题是否存在并做得更好. 文 / Micha ...
- 深入理解linux操作系统中的高端内存
Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图. Linux内核地址空间划分 通常32 ...
最新文章
- mysql40190_MySQL 内核深度优化
- .net的垃圾回收机制[转]
- python中math isnan,在python中指定一个变量NaN,不用numpy
- redis 3.2.1 centos7
- 从零开始学习docker(二十一)service管理
- SQL2005结合ROW_NUMBER()高效分页存储过程
- 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案
- ElasticSearch获取多个文档Multi GET API介绍
- javascript 不让成为nan_一张图彻底搞懂JavaScript的==运算
- 【Angular专题】——【译】Angular中的ForwardRef
- 全球首发!惯性导航导论(剑桥大学)第八部分
- html实现省市县选择,jQuery ajax实现省市县三级联动
- 联想扬天ACPI\LBAI0100未知设备的处理方法 此驱动为电源管理
- 阿泰,水晶报表--掌控对象
- 使用Guacamole实现远程桌面控制
- 经纪业务部负责人是什么工作
- 多元线性回归分析spss结果解读_SPSS--回归-多元线性回归模型案例解析
- csgo删除机器人_csgo1v1去除机器人 | 手游网游页游攻略大全
- 不得不说,时刻准备着
- 【CMU15-445数据库】bustub Project #0:Trie 树实现(C++ Primer)