在 C 或 C++ 中,当我们删除某个指针时,它只会释放内存,但不会将指针设置为 0。由于我们无法检查指针的有效性,因此程序员更容易检查指针的空性如果在释放内存后指针设置为 0。
我只是想知道为什么执行“删除”只是为了释放内存。
“由于我们无法检查指针的有效性,如果在释放内存后将指针设置为 0,程序员会更容易检查指针的空性。”
检查 nullvalue 可能会隐藏错误,同时增加代码大小和复杂性,并给人一种错误的安全感。不能保证指针值(在为空之前)没有被复制到其他地方。此外,这可以防止按值删除,这是对库(例如 OpenCV)的一个主要烦恼,这些库被误导,提供了清空删除操作。
不要使用这种适得其反的做法,而是使用确保正确清理和防止无效指针的技术,例如使用适当的智能指针。
因为,在 C++ 中,它(几乎)都是关于性能的。你不希望编译器添加代码,你不需要。你不希望你的程序做一些事情,你没有在你的代码中添加它们。
如果您确定,将检查/重用此指针,则无需取消。少一条指令。
另外,如果删除一个指针,将其设置为NULL
,那么指向已删除内存的其他指针会发生什么?它们不会被取消。这可能会导致坏事。
只需分配NULL
,如果你需要它。
没有必要:因为你只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;
}
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;
}
即使delete
将 NULL 分配给指针,它也不会使任何事情更安全。由于多个指针可以指向同一个内存地址,并且将 NULL 分配给其中之一不会使其他指针也为 NULL。
您可以删除 const 指针变量。将其设置为 NULL 是不可能的,仅在删除后将可变指针变量设置为 NULL 似乎有些不一致。