qiu*_*fei 281 c++ pointers memory-management null-pointer delete-operator
删除NULL指针是否安全?
它是一种很好的编码风格吗?
rus*_*lik 249
delete
无论如何都要执行检查,因此在您身边进行检查会增加开销并且看起来更加丑陋.一个非常好的做法后,指针设置为NULL delete
(有助于避免双重缺失和其它类似的内存损坏问题).
我也很喜欢,如果delete
默认情况下将参数设置为NULL,就像在
#define my_delete(x) {delete x; x = NULL;}
Run Code Online (Sandbox Code Playgroud)
(我知道R和L值,但不是很好吗?)
Chu*_*dad 74
来自C++ 0x草案标准.
$ 5.3.5/2 - "[...]在任何一种方法中,删除操作数的值可能是空指针值.[...'"
当然,没有人会对具有NULL值的指针进行"删除",但这样做是安全的.理想情况下,不应该有删除NULL指针的代码.但是当在循环中删除指针(例如在容器中)时,它有时很有用.由于删除NULL指针值是安全的,因此可以真正编写删除逻辑,而无需显式检查要删除的NULL操作数.
顺便说一下,C Standard $ 7.20.3.2也表示NULL指针上的'free'不执行任何操作.
free函数导致ptr指向的空间被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.
Jon*_*ler 44
是的,这是安全的.
删除空指针没有坏处; 如果将未分配的指针初始化为零然后简单地删除,它通常会减少函数尾部的测试次数.
由于上一句话引起了混淆,因此所描述的一个例子 - 这不是例外安全的:
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;
}
Run Code Online (Sandbox Code Playgroud)
可以使用示例代码选择各种类型的nits,但概念是(我希望)清楚.指针变量初始化为零,因此delete
函数末尾的操作不需要测试它们在源代码中是否为非空; 无论如何,库代码执行该检查.
Bri*_*ndy 20
删除空指针无效.这不是一个好的编码风格,因为它不是必需的,但它也不错.
如果您正在寻找良好的编码实践,请考虑使用智能指针,这样您根本不需要delete
.
为了补充ruslik的答案,在C++ 14中你可以使用这种结构:
delete std::exchange(heapObject, nullptr);
Run Code Online (Sandbox Code Playgroud)