c++ - 删除后将 C++ 指针初始化为零?

标签 c++ pointers memory-management

在 C++ 中,我们大多数时候使用 delete 运算符来删除对象。

delete 不会使指针值为 NULL。有什么方法可以自动实现吗?

例如

int *p = new int;
delete p;  // this should deallocate object pointed by p
           // and also initialized value of p = NULL

最佳答案

您的建议存在两个问题。

错误的安全感

您的建议会产生一种虚假的安全感。当然,标准保证如果您在空指针上调用 delete,它不会爆炸。但是,您忘记了一个小事实:没有一个指针指向您的对象。

int* p = new int(8);
int* q = p;
delete p; p = 0;
delete q; // Undefined Behavior

因此,这种做法是没有用的。而且因为错误的安全感比没有安全感更糟糕,所以我实际上强烈反对它。希望人们在应用 delete 时三思而后行。

这把我们带到了第二个问题

难道你不敢使用delete

delete 应保留给智能指针 或其他容器 的实现者。以下适用:

  • 仅限专家
  • (专家)不要*

*对于您要实现的目标,可能已经存在经过调试的实现。

现有的内存管理工具:

  • 无处不在的各种智能指针:std::unique_ptrstd::auto_ptr(取决于您的 C++ 版本)、std::scoped_ptr std::shared_ptr(及其比较std::weak_ptr,或它们的 boost/tr1 等价物)
  • 无处不在的各种容器:boost::arrayboost::scoped_arraystd::vector(和 co)
  • 还有鲜为人知但在 OO 中非常有用的:boost::ptr_vector(和合作)
  • 甚至还有 boost::intrusive_ptr 和 Boost Intrusive Containers 库或 Boost MultiIndex 库(带有 BiMap 衍生物)
  • 可能还有其他几个 boost 库,也许更专业,比如 Boost.Signals

面对如此多样化的野生动物,很难想象您会突然发现一种新的数据使用方式,这种方式与我们所做的截然不同,以至于您需要其他东西。如果您有,请随时发布,我们将帮助您了解如何使用这些工具来适应您的情况(或为您提供有关如何创建新形式的智能指针的指导)。

关于c++ - 删除后将 C++ 指针初始化为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5415302/

相关文章:

perl - 为什么在释放大数组时 Perl 不垃圾回收内存?

c++ - 如何禁止分配给不引用变量?

C++11:lambda 捕获以什么顺序被破坏?

c++如何在内部循环中使用带自动的 vector 删除对象

c - fgets 设置为 char * 导致段错误,动态字符串

c - 处理内存时出错 - mremap_chunk : Assertion

swift - iOS - 从模式演示中清除 View Controller 堆栈

c++ - boost::bind & std::set::count 编译错误

c++ - 如何设置opengl对象的大小?

c - C 中获取数组元素的指针