gpt4 book ai didi

c++ - 删除指针后将指针设为空是一种好习惯吗?

转载 作者:IT老高 更新时间:2023-10-28 11:32:29 27 4
gpt4 key购买 nike

首先我会说,使用智能指针,您将永远不必担心这一点。

下面的代码有什么问题?

Foo * p = new Foo;
// (use p)
delete p;
p = NULL;

这是由 an answer and comments 引发的另一个问题。来自 Neil Butterworth 的一条评论产生了一些赞成票:

Setting pointers to NULL following delete is not universal good practice in C++. There are times when it is a good thing to do, and times when it is pointless and can hide errors.

在很多情况下它都无济于事。但根据我的经验,它不会受到伤害。有人给我解惑。

最佳答案

将指针设置为 0(在标准 C++ 中为“null”,C 中对 NULL 的定义有些不同)避免双重删除时崩溃。

考虑以下几点:

Foo* foo = 0; // Sets the pointer to 0 (C++ NULL)
delete foo; // Won't do anything

鉴于:

Foo* foo = new Foo();
delete foo; // Deletes the object
delete foo; // Undefined behavior

换句话说,如果你不将已删除的指针设置为 0,那么在进行双重删除时就会遇到麻烦。反对在删除后将指针设置为 0 的一个论点是,这样做只会掩盖双重删除错误并使其未处理。

显然,最好不要出现双重删除错误,但根据所有权语义和对象生命周期,这在实践中可能很难实现。与 UB 相比,我更喜欢蒙面的双重删除错误。

最后,关于管理对象分配的旁注,我建议你看看 std::unique_ptr 用于严格/单一所有权,std::shared_ptr 用于共享所有权,或其他智能指针实现,具体取决于您的需要。

关于c++ - 删除指针后将指针设为空是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1931126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com