delete不会将0分配给指针

delete does not assign 0 to the pointer

本文关键字:分配 指针 delete      更新时间:2023-10-16

在C或C++中,当我们删除某个指针时,它只释放内存,但不会将指针设置为0。由于我们不能检查指针的有效性,因此如果在释放内存后将指针设置为0,程序员将更容易检查指针的空性。

我只是想知道为什么实现"删除"只是为了释放内存。

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

检查null值可能会隐藏错误,同时增加代码大小和复杂性,并给人一种虚假的安全感。不能保证指针值(在清零之前)没有被复制到其他地方。此外,这可以防止按值删除,这是库(如OpenCV)的一个主要烦恼,因为库被误导,提供了无效的删除操作。

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

因为在C++中,它(几乎)都是关于性能的。你不希望编译器添加代码,你不需要。你不希望你的程序做一些事情,因为你没有在代码中添加它们。

如果你确信,一旦有人会检查/重用这个指针,就没有必要取消。少一条指令。

此外,如果删除一个指针,将其设置为NULL,那么指向已删除内存的其他指针会发生什么情况?它们不会被废除。这可能会导致不好的事情。

如果需要,只需分配NULL即可。

没有必要:由于您的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;
}

即使delete将NULL赋值给指针,它也不会使任何事情变得更安全。由于多个指针可以指向同一个内存地址,将NULL分配给其中一个指针不会使其他指针也为NULL。

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

首先,出于效率原因,您可能需要在删除后进行指针运算:

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;
}