0

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

我只是想知道为什么执行“删除”只是为了释放内存。

4

6 回答 6

4

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

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

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

于 2012-08-02T13:32:54.837 回答
1

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

如果您确定,将检查/重用此指针,则无需取消。少一条指令。

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

只需分配NULL,如果你需要它。

于 2012-08-02T13:32:47.203 回答
1

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

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;
}
于 2012-08-02T13:33:01.317 回答
0

For one thing, you might want to do pointer arithmetic after delete for efficiency reasons:

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;
}
于 2012-08-02T13:37:05.657 回答
0

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

于 2012-08-02T13:35:40.523 回答
0

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

于 2012-08-02T13:36:32.677 回答