c ++ *&null验证

问题描述 投票:0回答:2

说我具有以下功能:

void destroy(Song* song) {
    if (song)
        delete song;
}

可以将实现更改为以下内容,以删除空验证吗?

void destroy(Song*& song) {
    delete song;
}

如果是,为什么?

c++ pointers reference dereference
2个回答
4
投票

您不需要检查是否为空,空指针上的delete有效且不执行任何操作。

请参见Is it safe to delete a NULL pointer?


如果我们假设空指针上的delete无效,那么您的destroy的第二种实现将无法工作,因为用户仍然可以执行以下操作:

Song* p = nullptr;
destroy(p);

1
投票

从C ++标准(8.3.5删除)

  1. ...在第一个替代项(删除对象)中,delete可以是空指针值,指向非数组对象的指针由先前的new表达式创建,或指向子对象的指针(4.5)表示此类对象的基类(第13条)。如果不,行为是不确定的。 [在第二个替代方案(删除数组)中,删除操作数的值可以是空指针值或先前数组new-expression.83产生的指针值。]

Sp检查空指针是多余的。对于C函数free同样有效。

© www.soinside.com 2019 - 2024. All rights reserved.