C++内存检测函数_CrtSetBreakAlloc()

在关闭C++的程序后,在VS编译器的 Output窗口后

出现如下情况:

<span style="font-size:18px;">f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {930} normal block at 0x0075E3F8, 22 bytes long.
 Data: <   w            > 84 CF DF 77 02 00 00 00 02 00 00 00 01 00 00 00
{928} normal block at 0x0075E328, 60 bytes long.
 Data: <   wd     u ` u > 98 CF DF 77 64 02 00 00 08 E4 75 00 60 E4 75 00
{926} normal block at 0x0075E278, 16 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{925} normal block at 0x0075EF18, 16 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span>

出现这种情况说明你的程序出现了内存泄露,单靠这些字符我们只能知道出错的地址是哪里,可是具体在哪里出错我们却无法判断。

微软提供了

long _CrtSetBreakAlloc(
   long lBreakAlloc
);

参数:lBreakAlloc 分配订单数,可以设置断点。

返回值:返回放置断点设置以前的对象分配订单号。

_CrtSetBreakAlloc 允许应用程序通过中断执行内存泄漏检测到特定点内存分配和跟踪回请求的原点。 函数使用的对象分配订单数量分配内存块时在堆中分配。

例子:

BOOL TMApp::InitInstance()

{

_CrtSetBreakAlloc(928);//928为出现泄露的内存地址

...

}

这样当运行到928这块地址值程序就会进入DeBug断点模式,我们就可以根据 Call Stack 找到内存泄露在代码中的位置了。

时间: 2024-08-26 16:07:17

C++内存检测函数_CrtSetBreakAlloc()的相关文章

C-数组, 字符串的输入输出, 内存分配, 三种内存分配函数

数组初始化 1.数组初始化的时候, 可以这样 1 int len = 3; 2 int arr[len]; 2.但是这样不可以: 1 int len = 3; 2 int arr[len] = {1, 2, 3}; 3.但是可以这样: 1 int arr[3] = {1, 2, 3}; 2不可以的原因: 编译器编译的时候 int arr[3] = {1, 2, 3}这种方式会转换成: 1 int arr[3]; 2 arr[0] = 1; 3 arr[1] = 2; 4 arr[2] = 3;

C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数

这个项目主要包含三部分:人脸检测.特征提取.性别分类: 这篇博客中我们重点介绍OpenCv的人脸检测函数.这篇博客我们先不提MFC,而是在win32控制台下编写一段人脸检测的程序. 一.开启摄像头 我们先讲解如何通过摄像头来采集图像,这听起来更有实际意义. 1.新建工程并配置OpenCv(注意工程类型选择win32控制台应用程序): 2.包含头文件 OpenCv2.x版本包含头文件非常方便,一句话搞定: #include <opencv2\opencv.hpp> using namespace

Android 内存泄露总结(附内存检测工具)

https://segmentfault.com/a/1190000006852540 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它

C/C++内存检测工具Valgrind

内存检测Valgrind简介 Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O'Reilly开源大奖的Julian Seward, 它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测, 我们可以使用它的工具:Memcheck.   Valgrind 安装 方法 1.  valgrind官网:http://valgrind.org下载 方法 2.  Ubuntu  sudo a

Cocos2d-x开发---关于内存检测

这几天面试的时候,面试官都会问我在游戏开发过程中是如何应对内存检测的,如何监控程序是否有内存泄漏的问题.在开发的过程中也没有认真的注意过这个问题(当然不是说不去关注程序的内存泄漏问题,而是说并没有特意到去思考如何去监控),因为上家公司使用的是xcode开发工具,其自带了性能监控的工具,平时也就是用的这个,可能没太在意这些吧. 因为面试官问这个比较多,然后我感觉自己确实需要多注意注意程序开发过程中的一些基础性问题,所以把自己所知道的整理整理. Mac上: 使用xcode进行开发,当运行模拟器或者进

Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数

请看下面的代码: program TestRecord; {$APPTYPE CONSOLE} uses  SysUtils,  Math; type  TRecordA = record    Name: string;  end; procedure RunTestRecord;var  R1, R2: TRecordA;begin  R1.Name := StringOfChar('A', RandomRange(64, 256) * 1024);  Move(R1, R2, SizeOf

申请内存的函数有哪些

申请内存的函数有哪些,以及其特点 其实总结起来,申请内存的函数主要有kmalloc,vmalloc,__get_free_page,malloc函数族,alloca.下面分别介绍: 1. vmalloc:内核态的内存申请函数,也是基于slab机制.申请的物理内存并不连续,速度相比于kmalloc要慢.用于申请大块内存.其分配的内存在内核空间中的动态映射区.Vmalloc能分配的内存较大,可以通过命令"cat /proc/meminfo | grep Vmalloc"来看.通过下图可以看

Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)

内存分配函数/内存管理API 参考: Windows MSDN http://msdn.microsoft.com/en-us/library/aa908768.aspx 附助资料: http://blog.csdn.net/susubuhui/article/details/7315094 http://wenku.baidu.com/link?url=yxgCWePPV1kFaIUciEspYgm34wNAnMLDoduBlfsEEo-mW0JFRVEOkixomUjPatqw_jOXZcq

使用内存管理函数实现动态数组

C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间释放,为有效地使用内存资源提供了手段. 动态数组,指的就是利用内存的申请和释放函数,在程序的运行过程中,根据实际需要指定数组的大小.其本质就是一个指向数组的指针变量. 主要用到的内存管理函数是:malloc和free. 1.分配内存函数malloc: 调用形式:(类型说明符*)malloc(size): 功     能:在内存的动态存储区中分配一块长度为size字节的连续区域. 返     回:该区域