Imcomplete class type delete(不完整类类型的删除)

     当delete不完整类类型对象的时候,不会调用对象的析构函数,导致内存泄漏。所以要避免delete 不确定类型。

    首先解释下不完整类类型Imcomplete class type:只见声明不见定义的类、结构体或是联合体;相对应的就是complete type,就是编译器可以确定的类型。

    下面举例说明:

    

     //delete_object.h
     class CObject;
     void delete_object(CObject* pObj); //p为imcomplete type
    
     //delete_object.cpp
     void delete_object(CObject* pObj) {delete pObj;}

     //CObject.h
     class CObject
     {
         //destructor 
         ~CObject() 
        {
            //destructor called.
        }
     }

     //main file
     #include "delete_object.h"
     #include "CObject.h"
     int main(int argc, char[] argv)
     {
         CObject* pObj = new CObject();
         delete_object(pObj);
     }


    这里的pObj对象在delete的时候就是不确定对象,编译器不知道它的类型,无法调用析构函数,最终导致内存泄漏。解决的最简单的方法,就是在delete_object.cpp文件中增加#include “CObject.h”语句即可。

     我们这里要重点介绍的是boost库中的使用的方法,方法使用的非常巧妙。整理如下:

   

    //utiles.h
    template<typename T> 
    inline void checked_delete(T * x)  
    {  
        // intentionally complex - simplification causes regressions   
        typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];  
        (void) sizeof(type_must_be_complete);  
        delete x;  
    } 
    template<typename T> 
    inline void checked_arraydelete(T * x)  
    {  
        // intentionally complex - simplification causes regressions   
        typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];  
        (void) sizeof(type_must_be_complete);  
        delete[] x;  
    } 
    template<typename T>
    struct checked_deleter
    {
        typedef void result_type;
        typedef T * argument_type;
        void operator()(T * p) const
        { 
            checked_delete(p);
        }
    };
    template<typename T>
    struct checked_arraydeleter
    {
        typedef void result_type;
        typedef T * argument_type;
        void operator()(T * p) const
        { 
            checked_arraydelete(p);
        }
    };


 

     //main file
     //#include "delete_object.h"
     #include "CObject.h"
     #include "utiles.h"
     int main(int argc, char[] argv)
     {
         CObject* pObj = new CObject();
         //delete_object(pObj);
         checked_deleter<CObject>(p);
     }


     既能在静态编译时监测出delete是否有问题,也可以安全的删除,不用再担心内存泄漏了!

   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值