为什么编译器在删除动态分配的内存后不会自动为指针变量赋值?

时间:2017-07-17 11:20:00

标签: c++ null new-operator delete-operator

我有一小段代码:

#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)?

4 个答案:

答案 0 :(得分:9)

  1. 通常没有必要,特别是在编写良好的代码中。

  2. 它可以隐藏错误。

  3. delete p;如果修改了它的参数,在语法上就是特殊的。

  4. 开(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 
}