在C或C ++中,当我们删除一些指针时,它只释放内存但不将指针设置为0.因为我们无法检查指针的有效性,所以程序员检查空值会更容易释放内存后,如果指针设置为0,则指针的指针。
我只是想知道为什么'删除'仅用于释放内存。
答案 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;
}