重载operator new实现检测内存泄漏是否可行
2014-09-21 23:12
288 查看
行与不行,就凭我这水平,说出来未免显示太过自大。不还,我还想根据自己的代码来讨论这个问题。
重载operator new来检测内存只的办法,那就是在new的时候记录指针地址及文件名、行号,在delete的时候取消记录。到最后程序结束,还有哪些指针未释放,则为泄漏。
第一步,你得重载operator new,或者也可以重写。在http://www.cplusplus.com/reference/new/operator%20new/中指明new有三种形式,因为我们还分配数组,故还有new[]这个函数也要重载。那么有6种。原文中指明“The allocating versions ((1) and (2)) are also replaceable:”,则说明我们只能重载4个函数(也必须,不然检测不到部分内存分配,没有意义)。由于placement new不会有内存泄漏,也不能重载,可以不管。
View Code
显然,p = new(buff) TTest();调用了第三种new函数void* operator new (std::size_t size, void* ptr) throw();由于参数问题编译报错。其实,第二、三种new函数原型在STL、BOOST里很常用。所以这种替换并不适用。
由于我并不知道编译器#define new new(__FILE__, __LINE__)是怎么去解释这行代码的,故没法写出一个实现三种函数原型都能替换的宏定义。当然,如果你只想知道有没有内存泄漏,不需要知道文件名、行号,则重写new函数而不是重载是可行的。但感觉这也太鸡肋了。
不知道有没有大神能实现函数的替换,望指教。
重载operator new来检测内存只的办法,那就是在new的时候记录指针地址及文件名、行号,在delete的时候取消记录。到最后程序结束,还有哪些指针未释放,则为泄漏。
第一步,你得重载operator new,或者也可以重写。在http://www.cplusplus.com/reference/new/operator%20new/中指明new有三种形式,因为我们还分配数组,故还有new[]这个函数也要重载。那么有6种。原文中指明“The allocating versions ((1) and (2)) are also replaceable:”,则说明我们只能重载4个函数(也必须,不然检测不到部分内存分配,没有意义)。由于placement new不会有内存泄漏,也不能重载,可以不管。
#include <iostream> #include <cstdlib> using namespace std; inline void *operator new[](std::size_t size, const char *file, int line) { std::cout << "memory allocate at " << file << " line " << line << std::endl; void *p = ::operator new(size);// operator new (size,std::nothrow) return p; } inline void * operator new(std::size_t size, const char *file, int line) { std::cout << "memory allocate at " << file << " line " << line << std::endl; void *p = ::operator new(size); return p; } inline void operator delete(void *p) { std::cout << "free" << std::endl; free(p); } inline void operator delete[] (void *p) { std::cout << "free[]" << std::endl; free(p); } #define new new(__FILE__, __LINE__) class TTest { public: TTest(){ std::cout << "construct...." << std::endl; } ~TTest(){ std::cout << "destruct...." << std::endl; } }; int main() { char *buff[10240] = {'\0'}; TTest *p = new TTest(); delete p; p = new(buff) TTest(); return 0; }
View Code
显然,p = new(buff) TTest();调用了第三种new函数void* operator new (std::size_t size, void* ptr) throw();由于参数问题编译报错。其实,第二、三种new函数原型在STL、BOOST里很常用。所以这种替换并不适用。
由于我并不知道编译器#define new new(__FILE__, __LINE__)是怎么去解释这行代码的,故没法写出一个实现三种函数原型都能替换的宏定义。当然,如果你只想知道有没有内存泄漏,不需要知道文件名、行号,则重写new函数而不是重载是可行的。但感觉这也太鸡肋了。
不知道有没有大神能实现函数的替换,望指教。
相关文章推荐
- 通过劫持系统函数malloc和free实现实时检测内存防泄漏(初级)
- 在Visual C++中检测和隔离内存泄漏
- 如何用dmalloc检测内存泄漏(原创)
- VC使用CRT调试功能检测内存泄漏
- asp代码实现检测组件是否安装的函数
- js实现网页检测是否安装了 Flash Player 插件
- 在VisualC++中检测和隔离内存泄漏
- 如何在 linux 下检测内存泄漏
- VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏(转)
- [code].检测内存泄漏 memory detection.
- asp 实现检测字符串是否为纯字母和数字组合的函数
- 在Visual C++中检测和隔离内存泄漏
- 如何在 linux 下检测内存泄漏
- 内存泄漏检测工具
- VC使用CRT调试功能检测内存泄漏
- VC使用CRT调试功能来检测内存泄漏
- VC使用CRT调试功能来检测内存泄漏
- 用BoundsChecker检测内存泄漏
- _CrtSetBreakAlloc(…)来检测内存泄漏
- asp代码实现检测组件是否安装的函数