为什么C++中允许删除空指针
Why is deleting null pointer allowed in C++
我记得在某个地方读到delete NULL
必须是C++中的有效操作,但我记不起为什么应该是这样了。有人能提醒我吗?
确切原因:
- 因为C++标准委员会决定这么做
可能的推理:
- 因为在用户代码中调用
delete
之前检查每个指针是否为NULL会导致代码膨胀
该规则不是严格必要的,因为如果没有它,语言就可以存在;这只是标准委员会做出的决定。空指针不是有效的内存地址。然而,我想相信,每一个决定都是有原因的,这些原因值得了解。
此规则简化了对故障情况和指针可能为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!
}
如果delete nullptr
是非法的,那么对delete
的每个调用都将被…包围
if(ptr)
那就太差劲了。既然这将是一种规范,一种基本上强制性的公约,为什么不完全消除检查的必要性呢?为什么每次调用delete
都需要额外的5个字符(最少)?
首先,NULL
从来都不是有效的指针值(在托管C++程序中),因此指针是否指向活动对象没有歧义。第二,内部内存管理逻辑无论如何都必须进行自己的检查才能记账,所以假设强制指针为非空不会带来任何好处。
因此,现在我们知道没有人反对这条规则,这里有一个对它有利的大论点:它使编写代码变得更容易。考虑一下这个简单的异常处理分配代码:
T * p1 = NULL;
T * p2 = NULL;
T * p3 = NULL;
try
{
p1 = new T;
p2 = new T;
p3 = new T;
}
catch (...)
{
delete p1;
delete p2;
delete p3;
throw;
}
这是简单而整洁的。如果我们需要在任何地方添加NULL检查,这将使代码的可读性大大降低,并模糊代码的逻辑。
因为标准委员会知道没有程序可以使用NULL来指向有效对象,即NULL不能指向有效内存,所以写delete NULL
是安全的,确切地说,因为它实际上不会删除任何东西。既然这是安全的,那么它就不用在delete
:之前检查NULL了
//if (ptr != NULL) NOT NEEDED
delete ptr; //safe even if ptr == NULL
if (ptr == nullptr) return;
。作为用户,您必须在整个程序中写入9999999999次。因此,这是一个简单的情况,在delete
内部进行操作要简单得多。
删除空指针无效(如果deallocation函数是标准库[2]中提供的函数),因此在调用delete之前不必检查空指针。
还检查删除NULL指针是否安全?它可能会帮助你
好吧,我清楚地记得,删除指向-const
的指针的规则(现在可以了)随着标准化而发生了变化,也就是说,它们在ARM(带注释的参考手册)中有所不同。
但我不确定是否删除0;我认为它一直得到支持。
无论如何,这只是为了方便,对于一个检查成本微不足道的操作,并且编译器可能/可能比用户定义的删除包装函数更有效地完成检查。
- 删除指向指针的指针是运行时错误吗
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 从矢量或地图中删除共享指针
- 从矢量中删除空元素
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 如何正确删除这些指针?
- 成员访问是否在空指针上定义C++?
- 为什么 GCC 不优化删除 C++ 中的空指针?
- 删除C++中的空指针
- std::shared_ptr 在空指针上调用非默认删除程序
- 为什么C++中允许删除空指针
- 在删除之前清空指针是否会导致内存泄漏
- 对于空指针,删除程序的标准行为在 shared_ptr 和 unique_ptr 之间是否不同
- 在C++中删除一个空指针被认为是未定义的行为
- 如何删除空指针
- 为空指针指定原始类型后删除该指针