删除NULL但没有编译错误

时间:2009-10-13 03:03:56

标签: c++ null

我很困惑为什么下面的C ++代码可以编译。为什么删除方法0的调用不会产生任何错误?!

int *arr = NULL;     // or if I use 0, it's the same thing      
delete arr;

我确实尝试过运行它,它根本没有给我任何错误......

5 个答案:

答案 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%肯定:)