我很困惑,为什么下面的C ++代码可以编译。 为什么一个电话,删除0的方法不会产生任何错误?
int *arr = NULL; // or if I use 0, it's the same thing
delete arr;
我也尝试运行它,它并没有给我任何错误在所有...
我很困惑,为什么下面的C ++代码可以编译。 为什么一个电话,删除0的方法不会产生任何错误?
int *arr = NULL; // or if I use 0, it's the same thing
delete arr;
我也尝试运行它,它并没有给我任何错误在所有...
C ++语言保证删除p不作什么,如果p等于NULL。
欲了解更多信息,请参阅第16.8,9 这里 :
您可以删除一个NULL指针没有问题,你可能/可能有错误不会在编译时间,但在运行时。
int *ptr_A = &a;
ptr_A = NULL;
delete ptr_A;
通常它很方便的事情:
...
delete ptr;
ptr = NULL;
这是C和(只在他们,而不是),C ++语言是资源重新分配程序必须接受空指针参数,只是什么也不做一个事实上的标准。 其实,这是一个相当convenent约定。 所以,真正的问题在这里:为什么它surprize吗? 是什么让你认为它应该产生一个错误? 此外,是什么让你认为它应该编译失败???
顺便说一句,你的问题,更说明的方式,似乎并没有太大的意义,因为你的代码实际上无法编译。 假想的指针声明缺乏型,这将使任何编译器发出诊断消息。
NULL和0是不一样的东西。 在C ++中,你应该使用0。
没有什么语法错误或不明确有关删除空指针。 实际上,这是通过定义一个无操作; 也就是说,删除第0地址的操作等同于什么都不做。
虽然你的例子很简单,没有办法的编译器知道(在编译时)指针的值。
您也可以在编译时提领空:
// this code compiles
Object* pObject = 0;
pObject->SomeMethod();
编译器不是建立在编译时处理这些类型的错误条件。
而大多数(所有?)实现了“删除0”作为非操作。 此代码应运行正常:
Object* pObject = new Object();
delete pObject;
pObject = 0;
delete pObject;
虽然我不是100%肯定上:)