使用CRT调试内存分配堆来找出未释放的内存空间

忘记释放已经分配的内存是一种常见的编程错误,当然我指的是在C++编程当中,例如下面的代码里面就存在一个忘记释放内存的编程错误。我个人觉得忘记释放内存的编程错误是不可避免的,毕竟程序员都是人,困了,心情不好了,代码过于复杂啦等等都可能导致忘记加上一句delete XXX语句。

#include <tchar.h>
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;class CTestClass
{
public:CTestClass(LPWSTR szName){m_lpName = new wstring(szName);}~CTestClass(){}void PrintName(){wcout << *m_lpName << endl;}
private:wstring *m_lpName;
};
HRESULT CreateTestClass(LPWSTR szName, CTestClass **ppObject)
{*ppObject = new CTestClass(szName);if ((*ppObject) == NULL)return E_FAIL;elsereturn S_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{CTestClass *pObject = NULL;HRESULT hr = CreateTestClass(L"This is a Test", &pObject);if (hr != S_OK){return -1;}else{pObject->PrintName();  // pObject没有被释放return 0;}
}

实际上Visual Studio已经提供了方法帮助你快速找到这些没有释放的内存。

Visual Studio提供了一系列的CRT调试API,CRT提供了一个调试内存分配堆,可以跟踪和管理内存在什么地方分配,当你在这个堆上分配内存的时候,每一次内存分配调用例如malloc或者new,CRT都会额外分配大约36个字节用来保存例如这个内存块分配的文件名、行号、内存块的大小等信息,最后CRT将这些内存块使用一个双链表链接起来。每一次内存释放的时候,free或者delete函数就从这个内存块链表里面将要释放的内存块删除,因此在需要检查内存泄漏的时候,只要遍历这个双链表依次打印出这些内存块就可以发现所有未释放的内存了。下面是CRT内存块的原始声明:

typedef struct _CrtMemBlockHeader
{// Pointer to the block allocated just before this one:struct _CrtMemBlockHeader *pBlockHeaderNext;// Pointer to the block allocated just after this one:struct _CrtMemBlockHeader *pBlockHeaderPrev;char *szFileName;    // File nameint nLine;           // Line numbersize_t nDataSize;    // Size of user blockint nBlockUse;       // Type of blocklong lRequest;       // Allocation number// Buffer just before (lower than) the user's memory:unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;

下面的代码演示了如何使用CRT提供的调试API来修改刚才的源文件检测未释放的内存空间(注意红色添加的部分):

#include <tchar.h>
#include <windows.h>
#include <string>
#include <iostream>
// 使用CRT调试API
#include <crtdbg.h>
using namespace std;
// 将所有的内存分配函数new替换成CRT提供的调试new
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new(_CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
class CTestClass
{
public:CTestClass(LPWSTR szName){m_lpName = new wstring(szName);}~CTestClass(){}void PrintName(){wcout << *m_lpName << endl;}
private:wstring *m_lpName;
};
HRESULT CreateTestClass(LPWSTR szName, CTestClass **ppObject)
{*ppObject = new CTestClass(szName);if ((*ppObject) == NULL)return E_FAIL;elsereturn S_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{  // 设置CRT调试API的报表输出模式,将所有的错误、警告还有断言都输出到控制台_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);CTestClass *pObject = NULL;HRESULT hr = CreateTestClass(L"This is a Test", &pObject);if (hr != S_OK){return -1;}else{pObject->PrintName();// 检查未释放的内存_CrtDumpMemoryLeaks();return 0;}
}

转载于:https://www.cnblogs.com/steady/archive/2011/04/26/2029654.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java bean工厂_从零构建轻量级Java Web框架

Bean工厂回顾下前面的知识&#xff0c;通过加载配置文件获取应用基础包名&#xff0c;加载基础包名下所有的类&#xff0c;获取Controller,Service类。到目前为止&#xff0c;我们只是加载了类&#xff0c;但是无法通过获取的类来实例化对象。因此需要一个反射工具&#xff0c;…

生活

爱上旁白&#xff0c;爱上娓娓道来&#xff0c;爱上有故事的声音。无需任何背景音乐&#xff0c;只想细细体验独有的味道转载于:https://www.cnblogs.com/Fsiswo/p/8167756.html

int指令01 - 零基础入门学习汇编语言64

第十三章&#xff1a;int指令01 让编程改变世界 Change the world by program 引言 在第12章中&#xff0c;我们讲解了中断过程和两种内中断的处理。 这一章中&#xff0c;我们讲解另一种重要的内中断&#xff0c;由int指令引发的中断。 万众瞩目&#xff0c;是什么呢&am…

JAVA中常用的逻辑运算符_Java中的常见运算符以及使用

Java中的运算符有算术运算符、关系运算符、逻辑运算符、赋值运算符、字符串连接运算符、三目运算符等。下面介绍一下这几种。1、算术运算符包括&#xff1a;加()、减(-)、乘(*)、除(/)、取余(%)、自加()、自减(--)。<1>使用乘法时&#xff0c;需注意乘积结果是否会出现溢…

【2016计概A期末】照亮房间

你需要放置一盏灯来照亮房间的每个角落&#xff0c;问这是否能办到&#xff1f; 输入包含多组数据。 每组数据第一行是正整数n(4<n<100)&#xff0c;表示房间轮廓所形成的多边形的顶点个数。 接下来n行&#xff0c;每行表示房间的一个顶点。 顶点按顺时针的顺序给出&…

Ext智能提示 - Spket(Eclipse插件)

Eclipse的Ext 2.0.2智能提示.它提供了非常准确的Ext API提示 最近在搞java的项目&#xff0c;哇哇&#xff0c;js如果没有插件的话&#xff0c;那写的真的叫痛苦&#xff0c;所以上网搜搜了&#xff0c;找到了一个插件&#xff0c;还不错&#xff0c;蛮好用的 首先下一个插…

JAVA fileupload怎么用_jquery.fileupload使用例子java

jsp页面信息如下&#xff0c;整个页面信息pageEncoding"utf-8" import"java.io.*"%>String path request.getContextPath();String basePath request.getScheme() "://" request.getServerName() ":" request.getServerPort()…

清高是有代价的

朋友C哥&#xff0c;才高八斗。虽然是记者出身&#xff0c;做过报社社长&#xff0c;但是老刘认为C哥之才&#xff0c;最重要的并非文章学问&#xff0c;而是做事之才、经营之才、管理之才。由报社社长至投资公司总裁&#xff0c;并完成某公司香港上市&#xff0c;被人誉为干了…

Java中常用的测试工具JUnit

使用步骤 1.新建一个test源文件夹&#xff08;SourceFolder&#xff09;&#xff0c;避免和业务代码的src混在一起 2.在test下新建JUnit Test Case 3.相关测试代码放到一个Test Case,每个小的测试代码搞一个测试的方法&#xff0c;方法上标记Test BeforeClass 标注BeforeClass的…

python pyqt eric_科学网—PyQt及Eric的安装 - 张鲁新的博文

PyQt及Eric的安装已有 10440 次阅读2010-4-16 13:19|个人分类:生活点滴|系统分类:科研笔记|Python, Eric, PyQtPython是功能很强大的脚本语言。Qt是跨平台的界面开发语言。二者的结合就是PyQt&#xff0c;而Eric则是由Python开发的一款支持PyQt的IDE。 Python目前有两个较大的版…

sharepoint对象模型性能比较

sharepoint的对象模型的属性和方法有多种&#xff0c;可能对于一些初学者不明白他们之间有什么区别&#xff0c;那种更优越&#xff0c;在何种情况下用那种属性或方法&#xff0c;通过这篇文章你会有所了解 1&#xff0c;splist 有些人喜欢通过列表的名字去获得列表&#xff0c…

package.json---入门说明

直接的说&#xff1a;就是管理你本地安装的npm包 一个package.json文件可以做如下事情&#xff1a; 展示项目所依赖的npm包 允许你指定一个包的版本[范围] 让你建立起稳定&#xff0c;意味着你可以更好的与其他开发者共享 创建package.json 在你要创建的目录下执行&#xff1a;…

java多线程实战指南_学习笔记《Java多线程编程实战指南》二

2.1线程属性属性属性类型及用途只读属性注意事项编号(id)long型,标识不同线程是不适合用作唯一标识名称(name)String型&#xff0c;区分不同线程否设置名称有助于代码调试和问题定位线程类别(daemon)boolean型&#xff0c;true为守护线程&#xff0c;false为用户线程否在start方…

putty, puttycm区别

2019独角兽企业重金招聘Python工程师标准>>> 在windows上实现telnet, ssh等工具有几个方案可以选择, 本文总结了putty putty cm的方案, 并且简短地和 cygwin console2方案做了一下比较. 由于putty的安装 配置比较简单, 本文主要讨论了Putty cm的配置和中文的支持.…

思科网络基础之访问控制列表

loading....转载于:https://www.cnblogs.com/changha0/p/8185866.html

java编写日期_Java常用日期操作

//日期转字符串,根据需要调整格式Testpublic voidDateToString(){Date currentTime newDate();SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateStringformatter.format(currentTime);System.out.println(dateString);}字符串转…

使用jQuery Treeview插件实现树状结构效果

首先到一个国外网站上下载Treeview插件&#xff1a;http://bassistance.de/jquery-plugins/jquery-plugin-treeview/当然你也可以通过我博客的源文件直接下载&#xff1a;http://files.cnblogs.com/jishume/jquery_api_for_dw4.rar 为了形象一点&#xff0c;先看一个效果图&…

冲刺二周04

第四天&#xff1a; 昨天干什么&#xff1a;完成搜索界面 今天干什么&#xff1a;编写模糊查询搜索的代码 遇见什么问题&#xff1a;不熟悉 团队成员会议照&#xff1a; 转载于:https://www.cnblogs.com/ghl0518/p/8301051.html

[转]The Top 10 Attributes of a Great Programmer

With all the latest attention again on what does and doesn’t make a good programmer, I couldn’t help but put together my own top 10 list. Being a great problem solver.Being driven and lazy at the same time.Ability to understand other people’s codeHaving…

zabbix查看mysql同步_Zabbix 检测Mysql数据库的主从同步

在高并发网站架构中&#xff0c;MySQL数据库主从同步是不可或缺的&#xff0c;不过经常会发生由于网络原因或者操作错误&#xff0c;MySQL主从经常会出现不同步的情况&#xff0c;那么如何监控MySQL主从同步&#xff0c;也变成检测网站正常运行的重要环节。MySQL同步功能由3个线…