为什么在C++中允许删除空指针

Vio*_*ffe 8 c++ delete-operator

我记得在某个地方读过delete NULL要在C++中成为有效的操作是必要的,但是我不能记得为什么它应该如此.有人请提醒我吗?

Alo*_*ave 14

确切原因:

  • 因为C++标准委员会决定如此.

可能的推理:

  • 因为在调用delete用户代码之前检查每个指针是否为过多的代码膨胀.


Ed *_* S. 11

该规则并非绝对必要,因为没有它,语言可能存在; 这只是标准委员会做出的决定.空指针不是有效的内存地址.但是,我想相信每个决定都是出于某种原因,这些理由值得了解.

此规则简化了失败案例的管理以及指针可能为null的其他实例.这是一个简单,便宜的检查,它为语言增添了明显的便利.

例如,如果存在许多可能导致动态内存分配的条件,但是其他条件也不存在,那么只需坚持delete最后并且不用担心它就很方便.

// contrived example
void foo(int n) {
    char *p = nullptr;
    switch(n) {
        case whatever:
        case something_else:
            p = new char[n];
            break;
    }

    // some code...

    delete [] p;  // look Ma, no check!
}
Run Code Online (Sandbox Code Playgroud)

如果delete nullptr是非法的,那么每次打电话delete都会被...包围

if(ptr)
Run Code Online (Sandbox Code Playgroud)

......那会很蹩脚.既然这是常态,一个基本上是强制性的约定,为什么不只是消除完全检查的需要?为什么每次通话都需要额外的5个字符(最少)delete

  • @stijn:我需要纠正自己; 空指针必须始终无效.空指针不一定必须是"0".`NULL`是一个在C中被定义为'0`的宏.语言本身就*空指针*及其语义来说.在实践中,它们通常是同一个,但它们不一定是一个.我必须检查标准:D (3认同)