VC++内存泄漏的检测(下)

news/2025/3/12 12:18:37/

VC++内存泄漏的检测(下)

实际的应用程序并不是这样简单,调用者之间的关系也是错综复杂,所以这更加需要高明的内存检测方案。比如我们的测试代码中有一个

类 my_test_class,这个类非常简单,但是有多个位置在使用这个类,代码如下所示:

class my_test_class
{
public:my_test_class(){data = new char[10];}virtual ~my_test_class(){delete[]data;}
private:char* data;
};

代码中的 my_test_class 类本身并没有问题,也不会有泄漏情况发生。但是如果使用这个类的位置发生内存泄漏,也会导致这个类本身的

内存泄漏,而且最后会被检测到。

测试代码如下:

#include <iostream>
#ifdef _DEBUG
#define new        new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define malloc(s)  _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#endifclass my_test_class
{
public:my_test_class(){data = new char[10];}virtual ~my_test_class(){delete[]data;}
private:char* data;
};void my_test_new()
{int* test1 = new int[100];int* test2 = new int[16];memset(test2, 0, 16);
}void my_test_malloc()
{my_test_class* test = new my_test_class();char* test1 = (char*)malloc(100);char* test2 = (char*)malloc(6);
}int main()
{//启用调试对管理_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF);std::cout << "Memory leak test" << std::endl;my_test_new();my_test_malloc();_CrtDumpMemoryLeaks();	 //显示内存泄漏报告return 0;
}

我们看到有两处test c的内存泄漏,位置都指向代码的第11行,即 my_test_class 的构造函数。但是我们无法在 my_test_class 的构造函

数中设置断点来查看调用的位置,因为有很多地方会调用 my_test_class 类,而且大部分调用是正常的。所以,我们需要使用其他方法,

使代码能够在发生内存泄漏时暂停,以便能够观察当时的运行环境,包括栈情况等。

前面介绍过,在输出窗口显示的内存泄漏报告中,除文件名和行号外,还有一个内存分配的序号。序号168对应的内存分配就是

my_test_class 构造函数中的 new 分配内存。所以我们希望在这次分配内存时,代码能够发生中断。

在 VC 运行时,库调试函数中还有一个函数,可以用来设置断点。函数原型如下:

_CrtSetBreakAlloc(_In_ long _NewValue );

该函数只有一个参数,就是内存分配的序号。即当内存分配到该序号时,代码就会发生中断。在代码中使用该函数,因为我们希望在第

168 次分配内存时发生中断,所以将 168作为参数传递,再重新按 F5 键执行代码,这时就会在第 168 次分配内存时发生中断.

而且我们可以很轻松地通过堆栈看到,main 函数中调用了 my_test_malloc 函数,my_test_malloc 函数中分配了 my_test_class,最后导致内存泄漏。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器


http://www.ppmy.cn/news/832221.html

相关文章

算法与数据结构(二)--【1】表的概念及其四种实现方式

一.表是什么 【1】定义&#xff1a;表&#xff0c;又称为线性表。线性表L是n个相同类型数据元素a(1),a(2),...,a(n)组成的有限序列。 【2】相关概念&#xff1a; 表长&#xff1a;线性表中元素的个数&#xff0c;n0时为空表。 【3】基本运算&#xff08;共七种&#xff09;&…

python 绘图英文字体_Python3实现英文字母转换哥特式字体实例代码

WARNING:低技术力 自己无聊写的 哥特字体是最好看的&#xff1a; 示例代码&#xff1a; #!usr/bin/env python3 # -*- coding:UTF-8 -*- sinput() d{"A":&#x1d504;, "B":&#x1d505;, "C":ℭ, "D":&#x1d507;, "E"…

Python3 英文字母转换哥特式字体

Python3 英文字母转换哥特式字体 WARNING:低技术力 自己无聊写的 哥特字体是最好看的&#xff0c;放一只蝙蝠给你们崇拜&#xff1a; #!usr/bin/env python3 # -*- coding:UTF-8 -*-sinput() d{"A":&#x1d504;,"B":&#x1d505;,"C":ℭ,&q…

经典c程序100例详解

文章目录 前言001-010001 无重复数字的三位数002 发放奖金总数003 100和68的完全平方数004 判断这一天是这一年的第几天005 三个数由小到大输出006 用*号输出字母C的图案007 输出特殊图案008 输出9*9口诀009 输出国际象棋棋盘010 打印楼梯 011-020011 兔子总数012 101-200之间有…

Photoshop设计精讲精练笔记

第一章 PS设计基础 1.1 工作区和工作流程 Photoshop 初步掌握PS的工作环境&#xff0c;工作流程以及基本特色&#xff0c;对于怎样使用PS有基本的体会&#xff0c;尽管现在市面上有各式各样的修图软件&#xff0c;PS仍然是最主流的数字图像处理软件。 面板和工作区&#xff1a;…

[oeasy]python0108_谷腾堡活字_哥特字体_罗马帝国_希腊文化_文艺复兴

谷腾堡活字 回忆上次内容 上次回顾了字型编码的进化过程 7-seg 七位数码管显示数字 14-seg 十四位数码管显示字母 米字管是数码管的进化版本 效果比较生硬 字符字型编码 后来又是如何显示的呢&#xff1f;&#x1f914; 曾经的字形 德国地区有自己独特的扁头笔 写出来的…

小学教师评职称计算机考试题,中小学美术教师职称晋升招聘考试题库(含答案)1...

(填空、选择、判断、简答、论述、连线) 填空题 1、中国美术史上至今发现最古老的装饰品&#xff0c;是距今约28940年前峙峪人制作的一件 石墨 装饰品。 2、仰韶文化彩陶以 半坡 类型和 庙底沟 类型的彩陶艺术成就最为杰出。 3、龙山文化阶段&#xff0c;作为当时建筑质量提高的…

【Latex 写作】基础语法

Latex 公式在线编辑器 目录 一. 公式1. 插入公式2. 注释3. 公式编号4. 换行5. 对齐6. 空格 二. 公式修饰1. 字体2. 上下标3. 上下划线4. 符号上下注释 三. 常见符号1. 运算符号2. 希腊字母3. 括号4. 省略号5. 箭头 参考资料 一. 公式 1. 插入公式 行中公式&#xff1a;使用单…