`
helpbs
  • 浏览: 1159084 次
文章分类
社区版块
存档分类
最新评论

原创: WINCE 内存泄露的检查(1) 对new/delete 或malloc/free在堆上申请的内存泄露的检查

 
阅读更多

这种方式的内存泄露的检查还是比较好办的,

首先重载 new/delete 或 malloc/free;

void* __cdecl operator new(size_t nSize,LPCSTR lpszFileName,int nLine);
void __cdecl operator delete(void *pvMem);

void* __cdecl operator new[](size_t nSize, LPCSTR lpszFileName, int nLine);
void __cdecl operator delete[](void *);

并定义

#define DEBUG_NEW new(__FILE__, __LINE__)
#define DEBUG_DELETE delete(__FILE__, __LINE__)

并在所有的代码文件中定义

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

在程序中维护一个全局的链表或者二叉树,当使用new/malloc申请内存时候,就会进入我们重载的new或者malloc,这样就可以把申请内存的文件名和行号记下,然后再delete/free时把对应的记录删除掉,在程序退出的时候检查全局链表或者二叉树,如果为空呢就没有内存泄露,如果不为空呢就可以定位到引起内存泄露的文件和行号。

废话少说马上附代码

(注:下面代码中没有在申请的内存前后添加特殊标示用于判断堆损坏等情况,还是比较简陋,程序最后会附一个网上很有名的内存泄露检查代码(debugnew(debugnew.h/debugnew.cpp)

程序代码以及debugnew的代码请到http://download.csdn.net/source/1590036下载

////////////////////////////////////////////////mem.h///////////////////////////////////////////////////////////////

#ifndef _MEM_H_
#define _MEM_H_

#pragma once

#include <map>
#include <utility>

using namespace std;
#pragma warning(disable:4291)

#define DIM(A) sizeof(A)/sizeof(A[0])

typedef struct tag_MemoryInfo
{
char tszFile[MAX_PATH];
ULONG cchLine;
size_t nMemSize;
}MemoryInfo;

#ifdef _DEBUG

extern map<DWORD,MemoryInfo> g_MemList;
void* __cdecl operator new(size_t nSize,LPCSTR lpszFileName,int nLine);
void __cdecl operator delete(void *pvMem);

void* __cdecl operator new[](size_t nSize, LPCSTR lpszFileName, int nLine);
void __cdecl operator delete[](void *);

#define DEBUG_NEW new(__FILE__, __LINE__)
#define DEBUG_DELETE delete(__FILE__, __LINE__)

#endif
#endif // _MEM_H_

////////////////////////////////////////////////mem.cpp///////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "mem.h"

#ifdef _DEBUG
map<DWORD,MemoryInfo> g_MemList;
void* __cdecl operator new(size_t nSize,LPCSTR lpszFileName,int nLine)
{
PVOID pVoid = ::operator new(nSize);
MemoryInfo mem;
mem.cchLine = nLine;
mem.nMemSize = nSize;
strcpy_s(mem.tszFile,DIM(mem.tszFile),lpszFileName);
g_MemList[(DWORD)pVoid] = mem;
return pVoid;
}

void __cdecl operator delete(void* p)
{
DWORD nKeyword = (DWORD)p;
if (!g_MemList.empty())
{
map<DWORD,MemoryInfo>::iterator iter= g_MemList.find(nKeyword);
if (iter != g_MemList.end())
{
g_MemList.erase(iter);
}
}
::free(p);
}

void* __cdecl operator new[](size_t nSize, LPCSTR lpszFileName, int nLine)
{
PVOID pVoid = ::operator new(nSize);
MemoryInfo mem;
mem.cchLine = nLine;
mem.nMemSize = nSize;
strcpy_s(mem.tszFile,DIM(mem.tszFile),lpszFileName);
g_MemList[(DWORD)pVoid] = mem;
return pVoid;
}

void __cdecl operator delete[](void *p)
{
DWORD nKeyword = (DWORD)p;
if (!g_MemList.empty())
{
map<DWORD,MemoryInfo>::iterator iter= g_MemList.find(nKeyword);
if (iter != g_MemList.end())
{
g_MemList.erase(iter);
}
}
::free(p);
}
#endif

其实这种方式引起的内存泄露完全可以通过智能指针来避免,并且智能指针还可以带来异常安全,智能指针例如标准库中的auto_ptr,但auto_ptr不是基于引用计数的所以不能用于标准库容器,对应要在容器中使用的智能指针可以通过采用Boost库中的共享指针或者自己写一个采用引用计数的智能指针(注:可以到http://download.csdn.net/source/1590077下载笔者自己写的只能指针)

分享到:
评论

相关推荐

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数;new/delete是C++操作符。 malloc/free只是动态分配内存空间/释放空间;new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。...

    C++中对使用malloc/new引起的内存泄露的检查

    C++中对使用malloc/new引起的内存泄露的检查,重载new/malloc delete/free来进行代码检查

    里仁教育详细讲解malloc/free和new/delete

    Malloc()与free()是C++/C语言的标准库函数,new/delete是C++的运算符,它们都可用于申请和释放动态内存。

    C++动态内存分配(new/new[]和delete/delete[])详解

    当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数...

    Malloc和new区别

    1 ,malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++ 的运算符。它们都可用于申请动态内存和释放内存。 2 ,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要...

    检查堆内存 踩内存,内存重复释放 内存泄露的小程序

    检查堆内存的问题,定位到文件,行数 1. 踩内存 2. 内存重复释放 3. 内存泄露 使用方法用 dbg_malloc, dbg_free 替换原程序中的malloc, free. 适当的时候调用dbg_memory_check 以检查内存泄露。 原理: ...

    ios-iOS内存泄漏、爆内存监控组件.zip

    好库推荐: ... 简介 OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。...3.内存泄漏检测:可检测OC对象、Malloc堆内存泄漏,提供泄漏堆栈信息

    C++中new与delete、malloc与free应用分析

    一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析...

    11_new&delete与malloc&free 之间的关系与区别1

    11_new&delete与malloc&free 之间的关系与区别1

    linux C 内存池实现

    C语言实现的内存池!j利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销。

    malloc内存泄漏检测

    通过宏定义检测malloc产生的内存泄漏,vc++ 6.0,vc++8.0可用。

    Linux之内存泄漏检测valgrind-memcheck. 附件测试代码.cpp

    【1】文章附件代码:https://blog.csdn.net/weixin_43780617/article/details/131805359?spm=1001.2014.3001.5501 【2】其中包含5种内存泄漏...4. 堆内存泄漏,没有成对使用malloc/free和new/delete; 5.两次释放内存;

    ios-Tencent开源:内存泄漏、爆内存监控.zip

    持续更新github地址 ... ...OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。...3.内存泄漏检测:可检测OC对象、Malloc堆内存泄漏,提供泄漏堆栈信息

    C++中malloc与free、new与delete的详解与应用

    C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。 两者相同点 1.都可以申请动态堆内存。 两者不同点 1.new/delete是C++的操作符,malloc/free是C/...

    基于Android Ndk/Jni的内存泄漏检测

    附件是Android下检测ndk和jni内存泄漏的demo,可以用于native中malloc和free的检测。使用方法(参见博客):https://blog.csdn.net/zhuyong006/article/details/88537499

    c++ 面试 2009

    1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存...

    ESP32带 log 记录的 malloc 动态申请内存,用于debug 调试查找报错原因

    嵌入式C开发中,正确动态使用 malloc,资源中写了一个 ...以ESP32为依托,旨在解决在【嵌入式工程】开发过程中,在动态申请内存这部分,由于 malloc 之后,忘记 free 释放,造成内存溢出导致 MCU重启的问题 参考博文: ...

    C++内存管理详解,new,delete的合理使用

    对应的new和delete要采用相同的形式 下面的语句有什么错? string *stringarray = new string[100]; ... delete stringarray; 一切好象都井然有序——一个new对应着一个delete——然而却隐藏着很大的错误:程序的...

    C++内存分配详解

    C++程序内存分配详解。堆与栈的比较。new/delete与malloc/free比较。

Global site tag (gtag.js) - Google Analytics