很久没有写技术方面的东西了,这半年主要是在学习别人的东西,对自己提高比较大,算是一次技术回笼吧,这次学习之旅目的是结束技术方面的专注,开始向应用方面找突破口,也就是完成技术积累或者为技术的积累做坚实的准备。

c/C++的一个让人疯狂的地方就是内存管理,非法访问、越界、野指针、泄漏、内存分配器等诸多问题,有时候一个编程老手也会迷惘困惑。Crt有一些堆栈检查的函数可以完成基本的内存状况检查,MFC也有一些简单的对象检查机制,当然好的算是java、.net等sdk的超重量级封装了,即使发生对象错误也能把堆栈信息明明白白的告诉你(至少表面上是这样,具体我对这两种语言没有做过开发)。下面介绍的是某牛公司实现的内存分配工具,基本实现了内存泄漏检查,对象合法性检查,对于我来说已经够用了。


为了对内存分配块进行跟踪,设计如下结构体:

技术回归01-Windows内存分配工具//+--------------------------------------------------------------
技术回归01-Windows内存分配工具//
技术回归01-Windows内存分配工具// 每个请求分配内存块的前缀结构体
技术回归01-Windows内存分配工具// 用来跟踪所有请求分配块以及请求分配名称
技术回归01-Windows内存分配工具//
技术回归01-Windows内存分配工具//---------------------------------------------------------------
技术回归01-Windows内存分配工具struct DBGALLOCHDR
};



为了实现多线程内存分配跟踪,采用Tls技术使用线程局部对象保存当前分配信息:

技术回归01-Windows内存分配工具// 线程局部对象结构体,辅助实现每个线程的请求内存分配记录
技术回归01-Windows内存分配工具struct DBGTHREADSTATE
}



主要实现的内存分配工具有如下这些:

技术回归01-Windows内存分配工具void*   _MemAlloc(ULONG cb);
技术回归01-Windows内存分配工具void*   _MemAllocClear(ULONG cb);
技术回归01-Windows内存分配工具HRESULT _MemRealloc(void** ppv, ULONG cb);
技术回归01-Windows内存分配工具ULONG   _MemGetSize(void* pv);
技术回归01-Windows内存分配工具void    _MemFree(void* pv);
技术回归01-Windows内存分配工具HRESULT _MemAllocString(LPCTSTR pchSrc, LPTSTR* ppchDst);
技术回归01-Windows内存分配工具HRESULT _MemAllocString(ULONG cch, LPCTSTR pchSrc, LPTSTR* ppchDst);
技术回归01-Windows内存分配工具HRESULT _MemReplaceString(LPCTSTR pchSrc, LPTSTR* ppchDest);
技术回归01-Windows内存分配工具
技术回归01-Windows内存分配工具#define MemAlloc(cb)                            _MemAlloc(cb)
技术回归01-Windows内存分配工具#define MemAllocClear(cb)                       _MemAllocClear(cb)
技术回归01-Windows内存分配工具#define MemRealloc(ppv, cb)                     _MemRealloc(ppv, cb)
技术回归01-Windows内存分配工具#define MemGetSize(pv)                          _MemGetSize(pv)
技术回归01-Windows内存分配工具#define MemFree(pv)                            _MemFree(pv)
技术回归01-Windows内存分配工具#define MemAllocString(pch, ppch)               _MemAllocString(pch, ppch)
技术回归01-Windows内存分配工具#define MemAllocStringBuffer(cch, pch, ppch)    _MemAllocString(cch, pch, ppch)
技术回归01-Windows内存分配工具#define MemReplaceString(pch, ppch)             _MemReplaceString(pch, ppch)
技术回归01-Windows内存分配工具#define MemFreeString(pch)                      _MemFree(pch)



通过宏实现类的new delete重写:

技术回归01-Windows内存分配工具#define DECLARE_MEMALLOC_NEW_DELETE() \
{ MemFree(pv); }



在应用的时候可以重写全局new delete:

技术回归01-Windows内存分配工具// 测试全局new delete
{ MemFree(pv); }


使用注意:
进程启动时候需要调用:
_DbgDllProcessAttach();
_afxGlobalData._hProcessHeap = GetProcessHeap();

进程退出的时候需要调用:
_DbgDllProcessDetach();

测试用例:

技术回归01-Windows内存分配工具// 测试基本类型
技术回归01-Windows内存分配工具void TestBuiltin()
}


调试输出窗口结果:
A +    4 -    0 = [      4]
A +   40 -    0 = [     44]
A +  100 -    0 = [    144]
A +    8 -    0 = [    152]
A +  400 -    0 = [    552]
The thread 0x1D38 has exited with code 0 (0x0).
A +    8 -    0 = [    560]
F +    0 -    8 = [    552]
---------- Leaked Memory Blocks ----------
p=0x00144354  cb=400  #=4    TID:0x1d38 
p=0x00144294  cb=8    #=3    TID:0x1878 
p=0x001441a4  cb=100  #=2    TID:0x1878 String
p=0x001440ec  cb=40   #=1    TID:0x1878 
p=0x00142a54  cb=4    #=0    TID:0x1878 
total size 552, peak size 560
---------- Leaked Memory Blocks End ------


其中A表示分配 F表示释放

 

该工具本人初试没有中毒症状,打算纳入个人小宝库中,希望大家喜欢!

下载

http://www.cppblog.com/wlwlxj/archive/2009/06/03/86660.html

相关文章:

  • 2021-05-31
  • 2021-04-03
  • 2022-01-13
  • 2021-07-17
  • 2021-10-17
  • 2021-11-12
  • 2021-11-27
猜你喜欢
  • 2021-07-24
  • 2021-07-05
  • 2022-01-24
  • 2022-12-23
  • 2021-07-26
  • 2022-12-23
相关资源
相似解决方案