• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++中关于Crt的内存泄漏检测的分析介绍

C++中关于Crt的内存泄漏检测的分析介绍

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++内存泄漏,c++内存泄漏检测,c++动态内存分配,c++内存管理,c++释放内存等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询。


int _tmain(int argc, _TCHAR* argv[])
{
    char* p = new char();
    char* pp = new char[10];
    char* ppp = (char*)malloc(10);

    _CrtDumpMemoryLeaks();

    return 0;
}
</div>
主要原理是运用Crt 的内存调试功能, 通过宏替代默认的operator new, 让它被下面版本替代:

    RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));

    /* if the allocation fails, we throw std::bad_alloc */
    if (res == 0)
    {
        static const std::bad_alloc nomem;
        _RAISE(nomem);
    }

    return res;
}
</div>
这样Crt会把此次分配内存的文件名和行号以及大小等记录下来,最后当调用用_CrtDumpMemoryLeaks(); 时如果还没释放就会打印出来。
结果如下:

(2)数字{108} {107}的作用
表示第几次分配, 你可以通过_CrtSetBreakAlloc程序运行到预定次数时暂停 ,比如

    char* p = new char();
    char* pp = new char[10];
    char* ppp = (char*)malloc(10);

    _CrtDumpMemoryLeaks();

    return 0;
}
</div>
(3)如果程序有多个出口或是有涉及到全局变量, 可以通过_CrtSetDbgFlag 设置标志让程序退出时自动打印泄露 , 比如

    char* p = new char();
    char* pp = new char[10];
    char* ppp = (char*)malloc(10);

    return 0;
}
</div>
(4)我们知道宏替代是最粗暴的方式, 所以尽量把下面new的替代宏放到每个Cpp里而不是放到一个通用的头文件中, 实际上MFC也是这么做的

#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif


int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    char* p = new char();
    char* pp = new char[10];
    char* ppp = (char*)malloc(10);

    char d;
    char* p1 = new(&d) char('a');

    return 0;
}
</div>
(6)因为STL里map内的tree用到了placement new,  所以如果你这样用会编译失败:

#include <map>
</div>
你应该把 #include <map>放到 宏定义的前面。

(7) 如果你在宏 #define new DEBUG_CLIENTBLOCK 之后再声明或定义 operator new函数, 都会因为宏替代而编译失败。
而STL的xdebug文件恰恰申明了operator new函数, 所以请确保new的替代宏放在所有include头文件的最后, 尤其要放在STL头文件的后面。

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif

MyClass::MyClass()
{
    char* p = new char('a');
}

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 怎么用C++提取任意一张图片的特征(从内存读取数据)
  • C++中的内存分区介绍
  • c++动态内存空间示例(自定义空间类型大小和空间长度)
  • 深入理解c/c++ 内存对齐
  • 关于C++内存中字节对齐问题的详细介绍
  • 基于C++中常见内存错误的总结
  • C++中关于Crt的内存泄漏检测的分析介绍

相关文章

  • 2017-05-28关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
  • 2017-05-28头文件不宜定义变量的原因全面解析
  • 2017-05-28C++实现将一个字符串中的字符替换成另一个字符串的方法
  • 2017-05-28显示内存状态示例分享
  • 2017-05-28解析C语言中位字段内存分配的问题
  • 2017-05-28C++11右值引用和std::move语句实例解析(推荐)
  • 2017-05-28C++获取多浏览器上网历史记录示例代码(支持获取IE/Chrome/FireFox)
  • 2017-05-28简单掌握Linux系统中fork()函数创建子进程的用法
  • 2017-05-28C++ 迷宫游戏实现代码
  • 2017-05-28在c和c++中实现函数回调

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言编程中的联合体union入门学习教程
    • 关于STL中vector容器的一些总结
    • C++ 静态成员的类内初始化详解及实例代码
    • 利用C语言实现HashTable
    • C++Primer笔记之顺序容器的使用详解
    • 利用C++的基本算法实现十个数排序
    • C语言关系运算符实例详解
    • C++实现简单的扫雷游戏(控制台版)
    • C++中赋值运算符与逗号运算符的用法详解
    • C++中auto_ptr智能指针的用法详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有