内存管理及泄露检测

 

 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

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值