我有一小段代码:
#include <iostream>
using namespace std;
int main()
{
int *p = new int(10);
if(p != NULL)
{
cout<<"Deleted dynamic allocated memory"<<endl;
delete p;
}
if(p == NULL)
{
cout<<"NULL"<<endl;
}
else
{
cout<<"Not NULL"<<endl;
}
return 0;
}
使用delete
运算符删除动态分配的内存后,为什么编译器不会自动为指针赋值NULL(如p = NULL)?
答案 0 :(得分:9)
通常没有必要,特别是在编写良好的代码中。
它可以隐藏错误。
delete p;
如果修改了它的参数,在语法上就是特殊的。
开(1)std::unique_ptr
会特别浪费。
换句话说,如果有必要,给程序员增加这项工作的负担是正确的。
答案 1 :(得分:2)
因为这是额外的工作(=更多的时钟周期,更少的性能),通常不需要。
答案 2 :(得分:2)
如果你的设计要求NULL指针指示它不再指向有用的东西,你可以添加代码来做到这一点。但这不应该是默认值,因为它可能不够充分且没有意义。
NULL指针无法解决所有可能的问题:
int *ip = new int;
int *ip1 = ip;
delete ip;
if (ip1)
*ip1 = 3; // BOOM!
他们往往毫无意义:
struct s {
int *ip;
s() : ip(new int) {}
~s() { delete ip; } // nobody cares if ip is NULL, 'cause you can't see it
};
答案 3 :(得分:0)
他们被允许这样做,但它不是强制性的。我认为他们不这样做的原因是因为无论如何你不能依赖它。例如,考虑一下:
int* a = new int(3);
int* b = a;
delete a;
/// ....
if (b != 0) { /// assume b is either null or points to something valid
std::cout << *b; /// ups
}