为什么编译器在删除动态分配的内存后不自动将 NULL 分配给指针变量?
Why compilers do not assign NULL to pointer variable automatically after deleting dynamic allocated memory?
我有一小段代码:
#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)?
因为这是额外的工作(=更多的时钟周期,更少的性能),所以通常不需要。
他们可以这样做,但这不是强制性的。我认为他们没有始终如一地这样做的原因是因为无论如何你都不能依赖它。例如考虑这个:
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
}
它通常是不必要的,特别是在编写良好的代码中。
它可以隐藏错误。
如果 delete p;
修改了它的参数,那么它在句法上会很奇怪。
在 (1) 上 std::unique_ptr
会特别浪费。
换句话说,必要时让程序员承担这项工作是正确的做法。
如果您的设计要求将指针设为 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
};
我有一小段代码:
#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)?
因为这是额外的工作(=更多的时钟周期,更少的性能),所以通常不需要。
他们可以这样做,但这不是强制性的。我认为他们没有始终如一地这样做的原因是因为无论如何你都不能依赖它。例如考虑这个:
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
}
它通常是不必要的,特别是在编写良好的代码中。
它可以隐藏错误。
如果 delete p;
修改了它的参数,那么它在句法上会很奇怪。
在 (1) 上 std::unique_ptr
会特别浪费。
换句话说,必要时让程序员承担这项工作是正确的做法。
如果您的设计要求将指针设为 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
};