delete不会将0分配给指针
delete does not assign 0 to the pointer
在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;
}
- 通过双指针分配指针
- 在不工作的情况下为数组分配指针,但反过来也可以
- 无法使用"std::make_shared"分配指针
- 分配指针时出现分段错误
- 为什么有时仅使用Ampersand运算符在C 中分配指针
- 重新分配指针阵列的一部分的安全方法
- 为什么在执行增量操作之前分配指针值
- 当指针指向的对象被另一个类的实例删除时,重新分配指针
- 在堆上分配指针的原因是什么?
- 有没有办法防止分配指针?
- 将运算符重写应用于具有动态分配指针的类
- 在堆上分配指针数组
- 在另一个结构中的结构内解除分配指针
- 分配指针后,是否可以为指针指向的事物分配变量名称?
- 重新分配指针后,将类功能与指针一起使用
- 为什么我的新分配指针会自动在程序退出上删除
- 分配指针的方法之间有什么区别?
- 如何声明和分配指针
- 内存分配(指针和堆栈)
- 通过参数分配指针的值