webkit中对incomplete type指针的处理技巧

本文深入解析WebKit源码中的deleteOwnedPtr函数,探讨其如何通过编译时检查防范因释放未完成类型(incomplete type)指针而引起的未定义行为,确保代码安全性。

近日在研究webkit的时候发现了一个函数

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

一开始对这个函数非常费解,为什么作者不直接

delete ptr;

 

通过上stackoverflow提问然后查阅了一些资料后终于得到结果:这是用来防范错误释放incomplete type指针而导致的未知的行为。这样做之后,释放incomplete type指针将引发一个编译错误,使可能的错误能够及早发现。

原文是:If we delete a pointer and the object has incomplete type, we get undefined behavior. Instead this code causes compilation to fail if the object has incomplete type. The use of a negative number for the size of an array is a way to guarantee we get a compilation error.

 

那么什么是incomplete type呢?顾名思义,就是一个只有声明没有定义完成的类型,比如前向声明。

举个例子

class SomeType;

void SomeFunction(SomeType* ptr)
{
    deleteOwnedPtr(ptr);
}

SomeType就是一个incomplete type,我们并不知道他的定义,如果我们企图释放该类型的指针,可能产生错误。

为了尽早避免出现这样的错误,我们先判断该指针指向的类型是否是incomplete type,然后人为引发一个编译期错误。

所以当ptr指向imcomplete type时,sizeof(T)结果为零,这时语句变为

typedef char[-1] known;
if (sizeof(known))
{
    ...
}

由于数组的大小不能为负,所以引发了编译错误,我们就能及早的发现可能出现的问题。

 

参考链接

http://stackoverflow.com/questions/10897998/i-cant-understand-the-deleteownedptr-function-in-webkit

转载于:https://www.cnblogs.com/Jiajun/archive/2012/11/15/2772072.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值