在C++中删除指针对象

7

我阅读了开源项目X3C中用于删除指针对象的以下代码。

//! Delete pointer object.
/*!
    \ingroup _GROUP_UTILFUNC
    \param p pointer object created using 'new'.
*/
template<class T>
void SafeDelete(T*& p)
{
    if (p != NULL)
        delete p;
    p = NULL;
    *(&p) = NULL;
}

但我不知道这行的意思:
*(&p) = NULL;

在上面这行代码中(p = NULL;),p被赋值为NULL。我认为还有另一种方式可以实现同样的效果。

很有趣。我想知道他们为什么要这样做。也许是为了编译器优化的原因或其他什么原因。 - Seth Carnegie
他们在SafeDeleteArray中没有奇怪地执行*(&x) = NULL;这个操作。 - Seth Carnegie
1
人们出于各种迷信原因编写奇怪的代码。或者可能是他们使用的某个编译器有漏洞? - Greg Hewgill
@Seth Carnegie:我也觉得这行代码有点奇怪:) 我想找出原因。 - thinkhy
@thinkhy,我认为我们都已经同意这是毫无意义的愚蠢行为。请参考下面Adam的回答。 - Seth Carnegie
显示剩余3条评论
1个回答

12
这完全没有意义。在普通情况下,一元操作符*&是彼此的反函数(有一些细节需要注意,例如表达式&*foo即使foo是左值也不是左值),尽管运算符重载可以改变这种行为。
然而,由于T*始终是指针类型,而与类型T无关,因此不可能对T*重载一元操作符operator&,因此*(&p)等同于p,第二次将NULL赋给p是没有用的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接