在 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_ptr
或std::auto_ptr
(取决于您的 C++ 版本)、std::scoped_ptr
、std::shared_ptr
(及其比较std::weak_ptr
,或它们的 boost/tr1 等价物) - 无处不在的各种容器:
boost::array
、boost::scoped_array
、std::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/