删除空指针是否安全?
删除空指针是否安全?
这是一个很好的编码风格?
无论如何delete
执行检查,所以检查在你身边增加开销,看起来丑陋。 一个非常好的做法是在delete
后将指针设置为NULL(有助于避免双重删除和其他类似的内存损坏问题)。
我也喜欢如果delete
默认情况下设置参数为NULL,如in
#define my_delete(x) {delete x; x = NULL;}
(我知道R和L值,但不是很好吗?)
从C ++ 0x草案标准。
$ 5.3.5 / 2 – “[…]在任何一种情况下,delete操作数的值都可以是一个空指针值。[…'”
当然,没有人会删除一个NULL值的指针,但是这样做是安全的。 理想情况下,不应该有删除空指针的代码。 但是,在循环中删除指针(例如在一个容器中)时,它有时是有用的。 由于NULL指针值的删除是安全的,所以可以真正写删除逻辑,而不用显式检查要删除的NULL操作数。
顺便说一下,C标准$ 7.20.3.2也说,空指针上的'free'没有任何作用。
自由函数使ptr指向的空间被释放,也就是说,可用于进一步的分配。 如果ptr是空指针,则不会发生任何操作。
是的,这是安全的。
删除空指针并没有什么坏处, 如果将未分配的指针初始化为零,然后简单地删除,它通常会减少函数尾部的测试次数。
既然前面的句子引起了混淆,一个例子 – 这并不是特别安全的 – 正在描述的是:
void somefunc(void) { SomeType *pst = 0; AnotherType *pat = 0; … pst = new SomeType; … if (…) { pat = new AnotherType[10]; … } if (…) { …code using pat sometimes… } delete[] pat; delete pst; }
有样本代码可以挑选各种各样的尼姑,但概念是(我希望)明确。 指针变量初始化为零,以便函数末尾的delete
操作不需要测试它们在源代码中是否为非空; 库代码无论如何执行该检查。
删除一个空指针没有效果。 编码风格不是必须的,因为它不是必需的,但也不错。
如果您正在寻找良好的编码习惯,请考虑使用智能指针,所以您根本不需要delete
。
除非重载删除操作符,否则它是安全的。
我已经经历过,删除[] NULL(即数组语法)是不安全的(VS2010)。 我不确定这是否符合C ++标准。
删除NULL(标量语法) 是安全的。
为了补充ruslik的答案,在C ++ 14中,你可以使用这个构造:
delete std::exchange(heapObject, nullptr);