我很困惑为什么下面的C ++代码可以编译。为什么删除方法0的调用不会产生任何错误?!
int *arr = NULL; // or if I use 0, it's the same thing
delete arr;
我确实尝试过运行它,它根本没有给我任何错误......
答案 0 :(得分:19)
C ++语言保证如果p等于,delete p将不执行任何操作 NULL。
有关详情,请参阅第16.8,9节here:
答案 1 :(得分:1)
您可以毫无问题地删除NULL指针,并且您可能/可能具有的错误不会在编译时但在运行时。
int *ptr_A = &a;
ptr_A = NULL;
delete ptr_A;
通常这样做很方便:
...
delete ptr;
ptr = NULL;
答案 2 :(得分:1)
它是C和C ++语言(而不仅仅是其中)的事实上的标准,资源释放例程必须接受空指针参数并且什么都不做。实际上,这是一个相当召集的惯例。所以,这里真正的问题是:为什么它会让你大吃一惊?是什么让你认为它应该产生错误?而且,是什么让你认为它不应该编译 ???
顺便说一句,你的问题,它的陈述方式似乎没有多大意义,因为你的代码实际上无法编译。假设的指针声明缺少一个类型,这将使任何编译器发出诊断消息。答案 3 :(得分:0)
NULL和0不是一回事。在C ++中,你应该使用0。
删除空指针没有任何语法错误或含糊不清。事实上,根据定义,这是一个无操作;也就是说,删除第0个地址的操作相当于什么都不做。
答案 4 :(得分:0)
虽然您的示例很简单,但编译器无法知道(在编译时)指针的值。
您还可以在编译时取消引用null:
// this code compiles
Object* pObject = 0;
pObject->SomeMethod();
编译器不是为在编译时处理这些错误条件而构建的。
大多数(所有?)实现都将'delete 0'作为非操作。这段代码运行良好:
Object* pObject = new Object();
delete pObject;
pObject = 0;
delete pObject;
虽然我不是100%肯定:)