WTF之安全删除对象

在 source/javascriptcore/wtf/OwnPtrCommon.h中有这么一段代码:

template <typename T> inline void deleteOwnedPtr(T* ptr)
{
    typedef char known[sizeof(T) ? 1 : -1];
    if (sizeof(known))
      delete ptr; 
}

该函数让编译器检查不完整类型(incomplete types),以实现安全删除对象,boost中也有类似的技法:
//http://www.boost.org/doc/libs/1_35_0/boost/checked_delete.hpp
// verify that types are complete for increased safety
template<class 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;
}

这里利用了sizeof操作符应用到不完整类型上面时,编译器会报错;即使在某些编译器上通过了编译,声明一个大小为-1的数组,也会报错。

--------------------------------------------------------------------------------------
不完整类型,包括:
1. void
2. 未知大小的数组
3. 不完整类型元素的数组
4. 没有定义的结构、联合,或者枚举
5. 声明但没有定义的类
6. 指向声明但没有定义类的指针 

sizeof操作符不能用在以下操作数上:
(摘录于:http://msdn.microsoft.com/en-us/library/4s7x1k91(v=vs.71).aspx
1.Functions (However, sizeof can be applied to pointers to functions)
2.Bit fields
3.Undefined classes
4.The type void
5.Dynamically allocated arrays
6.External arrays
7.Incomplete types
8.Parenthesized names of incomplete types
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值