C++ template Day Day Up 第四天 Boost::checked_delete

//DeleteObject.h

 

class  Item;

class  DeleteObject
{
public:
    DeleteObject(
void);
public:
    
~DeleteObject(void);

    
void DeleteItem(Item* p);
}
;

//DeleteObject.cpp

 

#include  " StdAfx.h "
#include 
" DeleteObject.h "
#include 
< boost / checked_delete.hpp >

DeleteObject::DeleteObject(
void )
{
}


DeleteObject::
~ DeleteObject( void )
{
}


void  DeleteObject::DeleteItem( Item *  p )
{
    delete p;
}

//item.h

 

#include  < iostream >

class  Item
{
public:
    
~Item()
    
{
        std::cout
<<"Item destruction ";
    }

}
;

//main.cpp

#include "DeleteObject.h"
#include "Item.h"

 DeleteObject del;
 del.DeleteItem(new Item);

/

结果Item的析构函数没有被调用~

这是因为DeleteObject并不知道Item的详细定义,这是C++中一个很危险的错误!(还好编译器一般都给warning)

怎么解决这个问题呢?

利用Boost库中的checked_delete

定义如下:

 

template < class  T >  inline  void  checked_delete(T  *  x)
{
    
// intentionally complex - simplification causes regressions
    typedef char type_must_be_complete[ sizeof(T)? 1-1 ];
    (
voidsizeof(type_must_be_complete);
    delete x;
}


template
< class  T >  inline  void  checked_array_delete(T  *  x)
{
    typedef 
char type_must_be_complete[ sizeof(T)? 1-1 ];
    (
voidsizeof(type_must_be_complete);
    delete [] x;
}

可以看到利用C的一个语法——数组长度必须大于零,来解决这个问题,typedef是发生在编译期,而sizeof同样是在编译期,所以这两行代码不会对程序的效率空间等等产生任何影响,只会在上面所举的例子发生的时候报编译错误。

现在将代码改为:

 

void  DeleteObject::DeleteItem( Item *  p )
{
    boost::checked_delete(p);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值