C++内存泄漏的检查定位

Bless_Super 2018-01-31 02:58:41
大家好,近日编程遇到些问题,涉及内存管理。问题如下:
需求是建立一个树形结构,用于快速查找。在构造函数中进行了内存分配
Tree::Tree()
{
_leaf = (TreeData*)malloc(sizeof(TreeData));
_leaf->element = NULL;
_leaf->firstChild = NULL;
_leaf->parent = NULL;
_leaf->rightNeighbor = NULL;
_leaf->rightBroTree = NULL;
}
在建树过程中同样有类似的操作。
为了定位内存泄漏的地方使用如下方法:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG //重载new
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

_CrtMemCheckpoint(&s1);
//Tree tree; //此处为函数实现...
_CrtMemCheckpoint(&s2);
if (_CrtMemDifference(&s3, &s1, &s2))
_CrtMemDumpStatistics(&s3);
_CrtDumpMemoryLeaks();

_CrtMemDumpStatistics这个函数的输出结果为:
0 bytes in 0 Free Blocks.
20 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 20 bytes.
问题1:从上面的输出结果中如何看出内存泄漏(好像有输出就有泄漏),如何定位到泄漏的地方

_CrtDumpMemoryLeaks();函数的输出结果为:
{10018} normal block at 0x04971BF8, 52 bytes long.
Data: <x P > 78 F3 95 04 C8 F4 95 04 50 0F 96 04 10 11 96 04
{10017} normal block at 0x0497AB28, 112 bytes long.
Data: < 9 h: > 18 39 93 04 68 3A 93 04 08 11 94 04 C8 12 94 04
..\src\mesh.cpp(67) : {10016} normal block at 0x0497AAC8, 32 bytes long.
Data: < > 08 A9 97 04 01 CD CD CD 00 00 00 00 00 00 00 00
..\src\mesh.cpp(63) : {10015} normal block at 0x0497AA58, 48 bytes long.

问题2:从这个结果中可以看出来在mesh.cpp中63,67行有内存泄漏,但是上面几个normal block的信息如何定位[i][/i]

编程半路出家,很粗糙,先谢过了!

...全文
709 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-02-05
  • 打赏
  • 举报
回复
引用 12 楼 han542672919 的回复:
试过几个检测内存泄露的工具,发现最实在的办法就是 #if 0 #endif
http://blog.csdn.net/zhao4zhong1/article/details/53078924 老司机找bug的十年心路历程
J_流儿 2018-02-04
  • 打赏
  • 举报
回复
试过几个检测内存泄露的工具,发现最实在的办法就是 #if 0 #endif
AlbertS 2018-02-01
  • 打赏
  • 举报
回复
可以搜一下vld的用法,添加个头文件就好,用起来比较方便
百合杰 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 zilaishuichina 的回复:
用工具吧 leakdiag , 非侵入式的, 不用修改原有代码, 你可以搜搜怎么用
gotIT
烟袅许伊 2018-02-01
  • 打赏
  • 举报
回复
其实不用,这种内存泄露,首先,你知道是20字节大小的块,如果你是new的内存,那就把你自己写的类前面加入一个可标示字符串,比如

class Test
{
private:
        char token[4];
}
Bless_Super 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 zilaishuichina 的回复:
用工具吧 leakdiag , 非侵入式的, 不用修改原有代码, 你可以搜搜怎么用
好的。我去看一下,多谢
Bless_Super 2018-02-01
  • 打赏
  • 举报
回复
引用 3 楼 mxway 的回复:
#define _CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  
#ifdef _DEBUG //重载new    
#define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)      
#endif 
把这段预处理代码放到你写的所有.c或.cpp文件中的所有#include指令之后。因为#include<stdio.h>或#include<iostream>有可能会覆盖你的宏定义
好的,我去改一下
Bless_Super 2018-02-01
  • 打赏
  • 举报
回复
引用 9 楼 shihengzhen101 的回复:
可以搜一下vld的用法,添加个头文件就好,用起来比较方便
好的,我去试试,谢谢回复
Bless_Super 2018-02-01
  • 打赏
  • 举报
回复
引用 7 楼 liugc2008 的回复:
其实不用,这种内存泄露,首先,你知道是20字节大小的块,如果你是new的内存,那就把你自己写的类前面加入一个可标示字符串,比如

class Test
{
private:
        char token[4];
}
好的好的,我去试试
zilaishuichina 2018-01-31
  • 打赏
  • 举报
回复
用工具吧 leakdiag , 非侵入式的, 不用修改原有代码, 你可以搜搜怎么用
mxway 2018-01-31
  • 打赏
  • 举报
回复
#define _CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  
#ifdef _DEBUG //重载new    
#define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)      
#endif 
把这段预处理代码放到你写的所有.c或.cpp文件中的所有#include指令之后。因为#include<stdio.h>或#include<iostream>有可能会覆盖你的宏定义
Bless_Super 2018-01-31
  • 打赏
  • 举报
回复
谢谢回复。您链接中的内容我都加上了
满衣兄 2018-01-31
  • 打赏
  • 举报
回复
https://archive.codeplex.com/?p=vld

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧