如何检测是否有内存泄露?

wenbaby 2008-03-07 03:39:38
在一个project中,有很多地方用到了new,也有很多地方对应地用到了delete,
不用任何工具,包括VS,怎么利用C++本身的特性,去检测是否存在new了,而
没有delete而存在内存泄露?不要用Find去搜索所有new的地方和delete的地方。
...全文
383 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xbt746 2008-03-10
  • 打赏
  • 举报
回复
支持重载
dead_of_winter 2008-03-09
  • 打赏
  • 举报
回复
在C++中内存泄露无法检查
除非你使用特别的编译器 改变指针为复杂类型来做类似垃圾回收的内存检查

非托管的内存泄露比你想象的要复杂的多 泄露的原因是指向已分配内存的指针丢失
泄露是运行时的行为 你无法预测程序的运行时状态 所以你也无法检查内存泄露 举个例子
int str()
{
char *r = new char[100];
return (int)r^35;
}
这段函数就无法判断其是否内存泄露 通过
char *r=(char*)(str()^35);

即可将它还原为原来内存地址的指针,之后可以delete[] r来释放内存

重载new和delete是一个很巧妙的方法,如果没有内存泄露,一个完整的应用程序执行的new和delete一定是相对应的。但是事实是,对任何一个程序来说,测试都不可能覆盖它的所有有效执行路径。所以这种方法也只能说起到一定作用。
billy1985 2008-03-09
  • 打赏
  • 举报
回复
用assert(ptr!=NULL)
vegetablebird_ 2008-03-09
  • 打赏
  • 举报
回复
断言
sdfz20033 2008-03-09
  • 打赏
  • 举报
回复
jf
visame 2008-03-08
  • 打赏
  • 举报
回复
楼上几位的方法都不错.
liujinxing 2008-03-08
  • 打赏
  • 举报
回复
学习
sucker2000 2008-03-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Supper_Jerry 的回复:]
不是封装,是重载,不好意思。
[/Quote]

也可以用封装啊:
#define NEW ...
#define NEW_ARR ...
#define NEW_ARG ...
#define DEL ...
#define DEL_ARR ...
Seanxiaoxiao 2008-03-08
  • 打赏
  • 举报
回复
用BoundsChecker和Visuall Assist X 配合,
先查处内存泄露的地方,然后用Assist来分析变量。
可以解决这个问题
星羽 2008-03-08
  • 打赏
  • 举报
回复
重载 operator new

ppzzhhsky 2008-03-08
  • 打赏
  • 举报
回复
assert(P!=NULL);
erator 2008-03-08
  • 打赏
  • 举报
回复
up
add08 2008-03-08
  • 打赏
  • 举报
回复
重定义new
薛勇 2008-03-08
  • 打赏
  • 举报
回复
用眼睛就可以看出来,打开任务管理器,如果程序中存在内存泄露,任务管理器中显示的那个程序内存增长的特别块,用不了多长时间系统就崩了,一般的系统也会出现内存增长,但是比较缓慢,比如运行一天系统才可能崩掉。
jieao111 2008-03-08
  • 打赏
  • 举报
回复
d
ketao_78 2008-03-07
  • 打赏
  • 举报
回复
Right , using valgrind .
MagiSu 2008-03-07
  • 打赏
  • 举报
回复
valgrind素王道
xory001 2008-03-07
  • 打赏
  • 举报
回复
MFC有个类可以比较,另外重载new delete,我也问过这样的问题.http://topic.csdn.net/u/20071115/14/f7e71d15-bf32-4bb3-9616-574cba9270e5.html
ryfdizuo 2008-03-07
  • 打赏
  • 举报
回复

#include <windows.h>
#include <iostream>
#include <crtdbg.h>
#include <malloc.h>
#include <string>
using namespace std;

class myString
{
public:
myString();

~myString();

private:
int nCount;
char *pszbuffer;

};

myString::myString()
{
this->nCount = 0;

this->pszbuffer = NULL;

cout<<"This is conStruction Function..."<<endl;
}

myString::~myString()
{
cout<<"This is Destory Function...."<<endl;
}

int main(void)
{
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );

myString my;

char *newString = (char*)malloc(sizeof(char) * 100);

strcpy(newString,"I come from china...");

cout<<newString<<endl;

//free(newString);

return 0;
}
//上面的代码,当你调试,退出的时候,输出窗口显示:
/*
Detected memory leaks!
Dumping objects ->
{121} normal block at 0x003A60C0, 100 bytes long.
Data: <I come from chin> 49 20 63 6F 6D 65 20 66 72 6F 6D 20 63 68 69 6E
Object dump complete.
*/

czp_opensource 2008-03-07
  • 打赏
  • 举报
回复
如何你用VS那就好办一点了。 VS有这样的宏, 在程启动前做一个内存的快照, 在退出后再做一次, 对两次做比较。 这个方法我以前用过。 不过现在记不住那个宏的名字了, 你去MSDN中查一下吧。
如果在linux上, 我现在知道的唯一个的方法就是对new 重载了。 把每次new和delete都做记录, 退出后再查看记录。
加载更多回复(4)

64,648

社区成员

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

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