2

在 Webkit 中找到了这个函数

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

为什么他们不使用

if (sizeof(T))
    delete ptr;

这是什么意思

char known[-1];
4

1 回答 1

1

在 webkit-dev 邮件列表中找到了解释。如果有人试图删除不完整的类型,它会引发编译器错误。

https://lists.webkit.org/pipermail/webkit-dev/2010-November/015051.html

如果我们删除一个指针并且对象的类型不完整,我们会得到未定义的行为。相反,如果对象的类型不完整,则此代码会导致编译失败。对数组大小使用负数是一种保证我们得到编译错误的方法。

于 2012-06-05T14:28:30.983 回答