如何检查自己的代码是否有发生内存泄露?

csubaicai 2008-09-27 02:31:22
rt!
1、写代码时有什么规范可以防止内存泄露的发生
2、在检查时,有什么标准判断可能存在内存泄露
3、在代码运行时,怎么判断内存泄露及其原因?
...全文
1017 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkndciapp 2008-09-28
  • 打赏
  • 举报
回复
delete于new
malloc &calloc 和free
一起搭配使用,如果有条件有标准库里面提供的
lily604 2008-09-28
  • 打赏
  • 举报
回复
多多使用标准模板库吧 要不然自己编的也不一定快
allenpettle 2008-09-28
  • 打赏
  • 举报
回复
真正优秀的程序员一般不会发生内存泄漏的失误,除非程序冗余度很大。
一旦出现了,可以采用一些Debug Tool来进行检测。
皮蛋C 2008-09-28
  • 打赏
  • 举报
回复
想简单的利用new delete配对防止内存泄漏是很难的,大系统里指针的生成数量,传递是很难控制的..最好的方法就是利用新技术,把指针转换为对象来使用 智能指针就是一种,也可以自己设计.
内存泄漏,在你DEBUG时会显示的.
sunyanlu 2008-09-28
  • 打赏
  • 举报
回复
free掉指针后 一定要让该指针 指空 (->NULL)
mxm324 2008-09-28
  • 打赏
  • 举报
回复
BoundChecker
ysuliu 2008-09-28
  • 打赏
  • 举报
回复
1、写代码时有什么规范可以防止内存泄露的发生
--全看程序员的经验了吧,一些编程技巧也是可以应用的,比如smart pointer,memory pool, 还有RAII技术等,编码阶段还得自己控制。

2、在检查时,有什么标准判断可能存在内存泄露
--检查工具有很多啊,不知道你在什么环境下,Linux下的valgrind不错,实在不行也可以尝试一些钩子函数,malloc的mallinfo等等,检查阶段还是工具用的比较多

3、在代码运行时,怎么判断内存泄露及其原因?
--那就得按case测了,打开一个内存状态检测工具,比如windows的任务管理器,反复跑一条case10次,甚至100次,根据具体情况而定,如果内存的状态是一直持续上升,那八成是泄露了,正常情况下如果有cache机制,那内存应该增长到一个合理的值就不再增长,如果是每次使用都释放,那每次释放后内存状态应该保持基本不变。如果发现内存泄露了,那就照着case去代码里找吧。。
zzhzhua 2008-09-28
  • 打赏
  • 举报
回复
还是在分配内存的时候一定要相应的释放内存。new和delete的数目要相同。
在VC中debug调试的表框中有显示。
taodm 2008-09-28
  • 打赏
  • 举报
回复
大量使用stl后,基本没有机会内存泄漏。
thecrypig 2008-09-28
  • 打赏
  • 举报
回复
还是如此 注意指针,new 与delete
可用boundcheker
adriano119 2008-09-28
  • 打赏
  • 举报
回复
当程序发生内存泄漏时,很难判断到底在哪里发生了泄漏
所以只能在写代码是注意了
new和delete 及malloc和free要成对出现
还有打开一个什么东西要记得关闭,否则也会出问题
wind_breez 2008-09-28
  • 打赏
  • 举报
回复
VC 用boundcheker, 另外用Visual Leak Detector也很不错。
palmax 2008-09-28
  • 打赏
  • 举报
回复
1.自己重载new,可以计算出你分配的对象对内存的占用
2.可以装bc
wangdeqie 2008-09-28
  • 打赏
  • 举报
回复
1.new的之后,要注意delete

2.


#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

int main()
{

//这里设个断点,然后F5->F10
int *p=(int*)malloc(sizeof(int)*4);
_CrtDumpMemoryLeaks();//Debug
}//F10走到这个,看下面Debug窗口信息,如下的话,就是有内存泄露


Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Detected memory leaks!
Dumping objects ->
{43} normal block at 0x00371000, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.


zgj828 2008-09-28
  • 打赏
  • 举报
回复
逛逛~~~~~
luxiaoxun 2008-09-28
  • 打赏
  • 举报
回复
http://nealblog.cn/blog/boblog/read.php/92.htm
http://blog.sina.com.cn/s/reader_541630be01000bs4.html
帅得不敢出门 2008-09-28
  • 打赏
  • 举报
回复
在Windows平台下,检测内存泄漏的工具常用的一般有三种,MS C-Runtime Library内建的检测功能;外挂式的检测工具,诸如,Purify,BoundsChecker等
vc 7.0 有检测工具BoundChecker
也有其他的检测工具.

也可以用代码检测
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <string.h>
#include <stdio.h>

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif


然后在要检测的代码前面加上:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
在后面加上:
_CrtDumpMemoryLeaks();
jieao111 2008-09-28
  • 打赏
  • 举报
回复
好多工具
bitxinhai 2008-09-28
  • 打赏
  • 举报
回复
如果是c++程序:
在你的程序中加入一下代码

#incldue<crtdbg.h>
程序结束的时候加入

_CrtDumpMemoryLeaks();
调试运行,看看输出,就知道有没有内存泄漏了
jia_xiaoxin 2008-09-28
  • 打赏
  • 举报
回复
1.尽量使用auto_ptr创建智能指针来代替直接用new创建的指针。
2.在每个代码段中尽量使用错误保护。try , catch
3.在debug的窗口里,可以看到一些内存泄漏的信息。
4.对于使用的每一个new ,都要检查匹配的delete
加载更多回复(11)

64,643

社区成员

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

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