- 浏览: 369720 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
转自
http://blog.csdn.net/hzyong_c/article/details/5949314
下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator new和operator delete,在重载的operator new里和operator delete里记录下内存申请和释放信息,从而判断内存使用情况。
下面一步步介绍它的实现!
1、 全局new/delete的重载
先看一下重载new/delete的规则:
重载的operator new的参数个数任意,但第一个参数必须是size_t类型的,返回值必须是void*。重载operator delete只允许有一个参数,且是void*型。
当然,不光要重载operator new 和 operator delete, 还要重载operator new [], operator delete [],更多operator new和operator delete重载的内容参考《Effective C++》
重载的new/delete, new[]/delete[]代码如下:
2、 用__FILE__, __LINE__记录new的位置
为了找到内存泄露的元凶,我要记录下每一处new所在的文件名和所在行。于是再次重载了operator new:
为了避免编译时出现warning C4291(没有与operator new(unsigned int,const char *,const unsigned int) 匹配的delete),又重载了
尽管我知道它没用。
我想到了用系统提供的__FILE__和 __LINE__宏获取当前文件名与行号,我试图把__FILE__和 __LINE__直接填到operator new和operator new[]函数体里边,然后把函数置成inline,结果都输出的是重载operator new和operator new[]的文件和函数体printf函数所在行。然后又试了将operator new的缺省参数设为__FILE__和 __LINE__结果依然,于是想到了用宏定义。
先看看MFC里的做法,MFC为了调试方便,对new进行了宏定义:
这里我借用MFC的做法,我也用宏定义:
3、 将malloc/free 用new/delete替换
为了便于统计malloc/free信息,也用宏定义的方法处理:
4、 在数据结构里存储内存使用情况。
下面写一个用于存储new/delete中内存信息的数据结构,可以使用链表,也可以使用哈希表,这里选用哈希表,写一个CHash类。
代码略。
5、 为了保证CHash在所有对象析构执行完之后再销毁,应该将CHash放在全局存储区,将其设成static类型,另外,如果有多个static,还需要注意放置的顺序。
到这里这个简易的内存泄露检测工具完成了,但目前还不能用于多线程。
http://blog.csdn.net/hzyong_c/article/details/5949314
下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator new和operator delete,在重载的operator new里和operator delete里记录下内存申请和释放信息,从而判断内存使用情况。
下面一步步介绍它的实现!
1、 全局new/delete的重载
先看一下重载new/delete的规则:
重载的operator new的参数个数任意,但第一个参数必须是size_t类型的,返回值必须是void*。重载operator delete只允许有一个参数,且是void*型。
当然,不光要重载operator new 和 operator delete, 还要重载operator new [], operator delete [],更多operator new和operator delete重载的内容参考《Effective C++》
重载的new/delete, new[]/delete[]代码如下:
void * operator new (size_t size){ if(0 == size){ return 0; } void *p = malloc(size); return p; } void * operator new [](size_t size){ return operator new(size); } void operator delete (void * pointer){ if(0 != pointer){ free(pointer); } } void operator delete[](void * pointer){ operator delete(pointer); }
2、 用__FILE__, __LINE__记录new的位置
为了找到内存泄露的元凶,我要记录下每一处new所在的文件名和所在行。于是再次重载了operator new:
void * operator new (size_t size, const char* file, const size_t line); void * operator new [](size_t size, const char* file, const size_t line);
为了避免编译时出现warning C4291(没有与operator new(unsigned int,const char *,const unsigned int) 匹配的delete),又重载了
void operator delete (void * pointer, const char* file, const size_t line); void operator delete[](void * pointer, const char* file, const size_t line);
尽管我知道它没用。
我想到了用系统提供的__FILE__和 __LINE__宏获取当前文件名与行号,我试图把__FILE__和 __LINE__直接填到operator new和operator new[]函数体里边,然后把函数置成inline,结果都输出的是重载operator new和operator new[]的文件和函数体printf函数所在行。然后又试了将operator new的缺省参数设为__FILE__和 __LINE__结果依然,于是想到了用宏定义。
先看看MFC里的做法,MFC为了调试方便,对new进行了宏定义:
#define new DEBUG_NEW #define DEBUG_NEW new(THIS_FILE, __LINE__)
这里我借用MFC的做法,我也用宏定义:
void * operator new (size_t size, const char* file, const size_t line); void * operator new [](size_t size, const char* file, const size_t line); #define MC_NEW new(__FILE__, __LINE__) #define new MC_NEW
3、 将malloc/free 用new/delete替换
为了便于统计malloc/free信息,也用宏定义的方法处理:
#define malloc(s) ((void*)new unsigned char[s]) #define free(p) (delete [] (char*)(p));
4、 在数据结构里存储内存使用情况。
下面写一个用于存储new/delete中内存信息的数据结构,可以使用链表,也可以使用哈希表,这里选用哈希表,写一个CHash类。
代码略。
5、 为了保证CHash在所有对象析构执行完之后再销毁,应该将CHash放在全局存储区,将其设成static类型,另外,如果有多个static,还需要注意放置的顺序。
到这里这个简易的内存泄露检测工具完成了,但目前还不能用于多线程。
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 410https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1325https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
[轉] android默认debug.keystore的密码
2017-12-12 11:14 1056http://blog.csdn.net/leehong200 ... -
Android NDK搭建環境
2017-11-27 13:25 580https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java反编译工具 - Java Decompiler
2017-06-21 20:14 475http://jd.benow.ca/ JD-GUI is ... -
JAVA环境变量配置
2017-06-19 13:56 356参考Link http://www.cnblogs.com/x ... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
Windows7上使用VMWare搭建iPhone开发环境
2017-05-17 08:49 449Windows7上使用VMWare搭建iPhone开发环境 h ... -
C++实现ping功能
2017-04-18 11:21 2154基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1880ERROR_SUCCESS 0 (0x0) T ... -
WinCE 内存检测
2016-09-30 16:30 644Wince内存泄露检测工具Application Verifi ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ...
相关推荐
标题中的“自定义数据new/delete源码”指的是程序员根据特定需求重载或替换C++内置的`new`和`delete`,以实现自定义的内存分配策略。这样做可以提供额外的功能,如日志记录、资源池管理、异常处理等。 `new`运算符...
结合以上两种方法,当`new`和`delete`被重载并配合钩子函数使用时,我们可以实现对内存分配的全面监控,例如,在分配内存时记录分配信息,在释放内存时检查是否所有分配的内存都已被释放。如果发现有未释放的内存,...
1. **重载的语法**:在C++中,你可以通过在类的作用域或全局作用域内定义`operator new`和`operator delete`函数来实现`new`的重载。例如: ```cpp void* operator new(size_t size) { // 自定义内存分配逻辑 } ...
从底层实现上看,`new`和`delete`实际上是通过重载`operator new`和`operator delete`这两个全局操作符来实现的。例如,`new`操作符通常会调用`operator new`,在内存分配失败时,可能还会尝试调用 `_callnewh` 函数...
本文将详细介绍一种名为`debugnew`的内存泄露检测工具,它通过重载`new`和`delete`操作符,帮助开发者定位内存泄露的位置。 #### 工具原理与使用 `debugnew`的核心机制在于重载`new`和`delete`操作符,以便在内存...
例如,我们可以创建一个全局的分配器类,包含一个静态成员变量来记录分配的内存总数,并在`new`和`delete`操作中更新这个计数。 ```cpp class CustomAllocator { public: void* operator new(size_t size) { void...
6. 全局的operator new也是可以重载的,但这样一来就不能再递归的使用new来分配内存,而只能使用malloc了。例如,void* operator new(size_t size){ printf("global newn"); return malloc(size);} 7. delete也有...
本话题主要探讨的是如何在C++中进行内存泄漏的检查,通过重载全局的`new/delete`以及`new[]/delete[]`操作符来实现。下面我们将深入讲解这个主题。 首先,了解内存泄漏的基本概念。内存泄漏是指程序在申请内存后,...
在描述的案例中,我们可能使用的是动态分析的一种,即通过重载全局或局部的`new`和`delete`运算符来追踪内存分配与释放。 首先,我们要理解`new`和`delete`运算符的作用。`new`用于动态分配内存,而`delete`用于...
2. **全局与类内重载的影响**:全局`new`和`delete`重载会改变所有默认的内存分配行为,可能导致链接错误如果多个库有相同重载。类内的重载仅影响该类及其派生类,但需注意成员函数的继承性。若只想为特定类提供...
在这个场景中,我们关注的是一个自定义的内存管理池(内存池),这是通过重载`new`运算符实现的。下面将详细讨论这个主题。 内存池是一种预先分配一大块内存并按需分配小块内存的技术。这种方法可以避免系统频繁地...
实现这一策略的一种方法是重载`operator new`和`operator delete`并将其声明为私有。 首先,让我们理解`operator new`和`operator delete`的作用。它们是C++中的全局运算符,负责动态内存分配和释放。`operator new...
- 可以通过重载全局的`new`和`delete`操作符来控制整个程序中所有对象的内存分配和释放过程。这种方式适用于所有类型的数据,包括基本类型和自定义类型。 2. **为单个的类重载new[]和delete[]操作符** - 当需要...
- **重载全局的new和delete操作符**:为了实现自定义的内存管理策略,可以重载new和delete,提供自定义的内存分配和释放逻辑,如记录内存使用情况、优化内存碎片等。 - **为单个的类重载new[]和delete[]**:当需要...
new,delete的重载函数,可以是全局函数,也可以是类内部的公有重载函数;当既有全局的重载函数,也有类内部的公有重载函数时,实际调用的是类内部的公有重载函数。 new,delete可以有多种重载方式,但是,new函数的...
实现这个内存检测器的关键在于重载`new`和`delete`操作符。重载`new`操作符的目的是在分配内存时记录分配的详细信息,如文件名、行号、分配的指针和大小。同样,重载`delete`操作符是为了在释放内存时更新记录,确保...
此外,通过重载`new`和`delete`,能够在不改变原有代码的情况下,实现对内存泄漏的自动化检测。 总的来说,有效的内存泄漏检测对于确保C++程序的健康运行至关重要。本文的方法提供了一种实用的解决方案,帮助开发者...
全局的operator new也是可以重载的,但这样一来就不能再递归的使用new来分配内存,而只能使用malloc了。 6. placement new的使用 placement new是用来实现定位构造的,可以在指定内存地址上用指定类型的构造函数来...