说我具有以下功能:
void destroy(Song* song) {
if (song)
delete song;
}
可以将实现更改为以下内容,以删除空验证吗?
void destroy(Song*& song) {
delete song;
}
如果是,为什么?
您不需要检查是否为空,空指针上的delete
有效且不执行任何操作。
请参见Is it safe to delete a NULL pointer?
如果我们假设空指针上的delete
无效,那么您的destroy
的第二种实现将无法工作,因为用户仍然可以执行以下操作:
Song* p = nullptr;
destroy(p);
从C ++标准(8.3.5删除)
- ...在第一个替代项(删除对象)中,delete可以是空指针值,指向非数组对象的指针由先前的new表达式创建,或指向子对象的指针(4.5)表示此类对象的基类(第13条)。如果不,行为是不确定的。 [在第二个替代方案(删除数组)中,删除操作数的值可以是空指针值或先前数组new-expression.83产生的指针值。]
Sp检查空指针是多余的。对于C函数
free
同样有效。