1 内存管理一直是程序所关心的问题,C++继承了C高效而又灵活的指针,虽然方便,但
是稍微不小心就会导致内存泄露,野指针,访问越界等错误,C++标准为我们提供了
只能指针std::auto_ptr 但并不能解决所有问题, 为了弥补不足,boost库中提供了六种智
能指针,其中比较常用的 scoped_ptr ,shared_ptr, scoped_ptr与auto_ptr最大的区别的是
所有权不能转让,同时把拷贝构造函数和赋值操作都声明为私有的。shared_ptr的智能使
其行为最接近原始指针,shared_ptr也提供线程安全保证.
2 如果你在编写代码时候没有使用智能指针导致内存泄露,不要担心,在茫茫代码中也
能定位到底是哪里动态申请内存时没有释放,Windows下为我们提供了2个函数是:
_CrtSetDbgFlag() 和_CrtSetBreakAlloc()函数。在main函数中只要调用
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );在程序退出
时,在调试窗口中会显示内存泄露信息。
如:Detected memory leaks!
Dumping objects ->
{144} normal block at 0x00393D40, 4 bytes long.
Data: <> T?
Object dump complete.
144表示第144次申请内存,normal block at 0x00393D40 表示申请的内存地
址,4 bytes long. 申请内存大小。 然后调用_CrtSetBreakAlloc(144);可以定位到申请内存
的地方,从而知道是哪里申请内存没有释放导至的内存泄露。
3 还是如何检测内存泄露的问题
主要分用malloc和new申请的内存的检测方法
new 的检测 :
在文件中先定义宏 #define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
说明:_NORMAL_BLOCK是调试堆中内存块的类型,总共5种。
然后main函数中 调用
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF );
如果用new申请了内存 int *q = new int(); 程序结束后会在调试窗口中显示在文
件中哪行出现了内存泄露及大小:
如 e:\hxht_workspace\vs\boost学习\new_malloc\new_malloc.cpp(12) : {56}
normal block at 0x00396DB0, 4 bytes long.
Data: < > 00 00 00 00
malloc的检测:
在文件中先定义宏
#define malloc(X) _malloc_dbg((x),_NORMAL_BLOCK,__FILE,__LINE__)
然后main函数中 调用
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF );
如果用new申请了内存 int *q = (int*)malloc(10) ;程序结束后会在调试窗口中显
示在文 件中哪行出现了内存泄露及大小:
如:e:\hxht_workspace\vs\boost学习\new_malloc\new_malloc.cpp(13) : {57}
normal block at 0x00396DF0, 10 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD