内存泄露 监测

yanasdf789 2014-07-25 04:40:10
经常遇到程序退出后 程序泄露问题
Detected memory leaks!
Dumping objects ->
{452} normal block at 0x02C219D8, 8230 bytes long.
Data: <0020010004 > 30 30 32 30 30 31 30 30 30 34 01 00 00 00 C4 FE
Object dump complete.

我用_CrtDumpMemoryLeaks()函数检测,
有时能定位到代码位置,但是有时不能
etected memory leaks!
Dumping objects ->
d:\小功能测试\testmemoryleaks\testmemoryleaks\testmemoryleaksdlg.cpp(166) : {421} normal block at 0x0031C100, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

如果不能定位 怎么找到内存泄露语句,还有没有更好的方法?消除内存泄漏

void CTestMemoryleaksDlg::GetMemory(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);


}

void CTestMemoryleaksDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();

char *str=NULL;
GetMemory(&str,100);



}


void CTestMemoryleaksDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码

_CrtDumpMemoryLeaks();
CDialogEx::OnCancel();

}
...全文
191 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2014-07-28
  • 打赏
  • 举报
回复
可以用工具检测 google LeakDiag
alex_my 2014-07-28
  • 打赏
  • 举报
回复
可以参考参考。 http://blog.csdn.net/alex_my/article/details/37726679 http://blog.csdn.net/alex_my/article/details/11488805
whoho 2014-07-26
  • 打赏
  • 举报
回复
既然你的程序是C++写的,而你对malloc/realloc/free不太有把握的话,(并且并没有特别的理由要使用C内存操作的话) 建议使用C++的机制,如STL容器,智能指针等 RAII,这是个非常有用的思想,去看一下吧,C++之父就非常推崇(STL,智能指针都可以算RAII的一种实现)
我看你有戏 2014-07-26
  • 打赏
  • 举报
回复
把代码全部注释了,一点一点打开注释,调试找内存泄漏
FeelTouch Labs 2014-07-25
  • 打赏
  • 举报
回复
引用 6 楼 Saleayas 的回复:
写程序的时候,要谨慎。 因为你不可能在你 Create 的地方去 Release。 所以 Vld 也仅仅是帮助。但是帮助还是很大的,而且 Vld 很好用。 主要 Dgbhlp 的版本。
支持这种说法,有时能事半功倍 我的智能创意,请支持一下
hellengoodd 2014-07-25
  • 打赏
  • 举报
回复
有个什么函数,,忘记了。。
Saleayas 2014-07-25
  • 打赏
  • 举报
回复
写程序的时候,要谨慎。 因为你不可能在你 Create 的地方去 Release。 所以 Vld 也仅仅是帮助。但是帮助还是很大的,而且 Vld 很好用。 主要 Dgbhlp 的版本。
tianyabin 2014-07-25
  • 打赏
  • 举报
回复
非常经典,值得一看
勤奋的小游侠 2014-07-25
  • 打赏
  • 举报
回复
Map<char*,int> MemList;//定义一个内存记录表 void CTestMemoryleaksDlg::GetMemory(char **p,int num,int MenType) { *p=(char*)malloc(sizeof(char)*num); MemList.insert(pair(*p,MenType));//将内存地址放入记录表中。 } void CTestMemoryleaksDlg::FreeMemory(char **p,int num) { map<char*,char*>:: iterator it = MemList.find(*p); if (it != MemList->end() ) { MemList.erase(it);//将内存记录删除. } free(*p); } //按上面的,自己写一个内存管理表,用自己的分配和删除接口。当程序结束时检查MemList就可以发现那一个内存没有放掉,查看MemType可以找到具体的代码块。
majia2011 2014-07-25
  • 打赏
  • 举报
回复
资源泄露这种事,是c程序的基本功,不要依赖工具,那样你会一直水下去,呵呵呵
mujiok2003 2014-07-25
  • 打赏
  • 举报
回复
根据地址,大小,内容等慢慢分析。
i_dovelemon 2014-07-25
  • 打赏
  • 举报
回复
我做开发的时候 一般都是用第三方插件的 , 比如我用vld,你上网搜搜如何使用它就好了,如果你使用的代码库有源代码的话,就能够定位到代码上,希望对你有帮助

64,654

社区成员

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

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