delete不为指针赋值0

时间:2012-08-02 13:26:46

标签: c++ c

在C或C ++中,当我们删除一些指针时,它只释放内存但不将指针设置为0.因为我们无法检查指针的有效性,所以程序员检查空值会更容易释放内存后,如果指针设置为0,则指针的指针。

我只是想知道为什么'删除'仅用于释放内存。

6 个答案:

答案 0 :(得分:4)

  

“由于我们无法检查指针的有效性,如果在释放内存后将指针设置为0,程序员将更容易检查指针的空值。”

检查nullvalue可能会在增加代码大小和复杂性的同时隐藏错误,并且会给出错误的安全感。无法保证指针值(在归零之前)未在其他位置复制。此外,这可以防止按值删除,这是一个主要的烦恼,因为库(例如OpenCV)误导了提供归零删除操作。

使用可确保正确清理并防止无效指针的技术(例如使用适当的智能指针),而不是这种适得其反的做法。

答案 1 :(得分:1)

因为,在C ++中,它(几乎)都是关于性能的。您不希望编译器添加代码,您不需要。您不希望程序执行任何操作,也没有将它们添加到代码中。

如果你确定,那个会检查/重用这个指针,就不需要取消。少一条指令。

另外,如果删除指针,将其设置为NULL,其他指针会发生什么,指向已经删除的内存?它们不会被废止。这可能会导致糟糕的事情。

如果需要,只需指定NULL即可。

答案 2 :(得分:1)

没有必要:因为你在SBRM包装器类的析构函数中只有delete,所以之后没有任何其他东西可以访问指针:

template <typename T> struct MyPtr
{
     template <typename ...Args> MyPtr(Args &&... args)
     : p(new T(std::forward<Args>(args)...)
     {   }

     ~MyPtr()
     {
         delete p;   // done! who cares what `p` is now.
     }

     MyPtr(MyPtr const &) = delete;
     MyPtr & operator=(MyPtr const &) = delete;

     T * operator->() { return p; }

private:
     T * p;
}

答案 3 :(得分:0)

即使delete为指针指定了NULL,也不会使任何事情变得更安全。由于多个指针可以指向相同的内存地址,并且为其中一个指定NULL也不会使其他内存为空。

答案 4 :(得分:0)

您可以删除const指针变量。将其设置为NULL是不可能的,仅在删除后将可变指针变量设置为NULL似乎有点不一致。

答案 5 :(得分:0)

首先,出于效率原因,您可能希望在删除后执行指针运算:

const int SIZE = 5;
MyObject* foo[SIZE];
// ... initialize foo with new MyObjects...
for (MyObject* i = &foo[0], end = &foo[0] + SIZE; i < end; ++i)
{
    delete i;
}