- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
首先我会说,使用智能指针,您将永远不必担心这一点。
下面的代码有什么问题?
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/
由“CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", ES_MULTILINE.."创建的文本框需要\r\n 换行。我将我的 stdoutput 重定向到那个文
我是一名优秀的程序员,十分优秀!