删除NULL,但没有编译错误(Delete NULL but no compile error)

2019-07-22 18:54发布

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

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

我也尝试运行它,它并没有给我任何错误在所有...

Answer 1:

C ++语言保证删除p不作什么,如果p等于NULL。

欲了解更多信息,请参阅第16.8,9 这里 :



Answer 2:

您可以删除一个NULL指针没有问题,你可能/可能有错误不会在编译时间,但在运行时。

int *ptr_A = &a;
ptr_A = NULL;
delete ptr_A;

通常它很方便的事情:

...
delete ptr;
ptr = NULL;


Answer 3:

这是C和(只在他们,而不是),C ++语言是资源重新分配程序必须接受空指针参数,只是什么也不做一个事实上的标准。 其实,这是一个相当convenent约定。 所以,真正的问题在这里:为什么它surprize吗? 是什么让你认为它应该产生一个错误? 此外,是什么让你认为它应该编译失败???

顺便说一句,你的问题,更说明的方式,似乎并没有太大的意义,因为你的代码实际上无法编译。 假想的指针声明缺乏型,这将使​​任何编译器发出诊断消息。



Answer 4:

NULL和0是不一样的东西。 在C ++中,你应该使用0。

没有什么语法错误或不明确有关删除空指针。 实际上,这是通过定义一个无操作; 也就是说,删除第0地址的操作等同于什么都不做。



Answer 5:

虽然你的例子很简单,没有办法的编译器知道(在编译时)指针的值。

您也可以在编译时提领空:

// this code compiles
Object* pObject = 0;
pObject->SomeMethod();

编译器不是建立在编译时处理这些类型的错误条件。

而大多数(所有?)实现了“删除0”作为非操作。 此代码应运行正常:

Object* pObject = new Object();
delete pObject;
pObject = 0;
delete pObject;

虽然我不是100%肯定上:)



文章来源: Delete NULL but no compile error
标签: c++ null