我应该在删除后分配我的指针 0 吗? [复制]

Posted

技术标签:

【中文标题】我应该在删除后分配我的指针 0 吗? [复制]【英文标题】:Should I assign my pointer 0 after delete? [duplicate] 【发布时间】:2011-05-18 06:36:20 【问题描述】:

可能重复:Is it good practice to NULL a pointer after deleting it?

我的教授告诉我们,在我们删除它指向的分配空间后将指针设置为 0 是一种很好的做法,我一直在努力养成这样做的习惯。但是当我这样做时,我的编译器会以我的方式发送警告:

警告 W8004 LinkedList.h 102: 'nPtr' 分配了一个从未使用过的值 在功能上 LinkedList::remove(int)

我知道警告不是世界末日,我的程序仍然可以编译,但我的强迫症不会放过它。所以我问你们更多知识渊博的程序员

删除节点后将指针设置为 0 是否很常见,这真的是一个好习惯吗? 如果我继续让我的程序编译时出现这样的警告,这有关系吗? 感谢所有答案!

【问题讨论】:

你使用什么编程语言? 对不起,我没有看到那个,不过我确实搜索过。我正在使用 C++ 事实上我链接到另一个线程的副本:***.com/questions/1879550/… 谢谢你的链接,我去看看。 【参考方案1】:

视情况而定。

正如 Karl 所说,虽然您应该安排删除操作,以免冒险使用已删除的指针,但如果对象的生命周期可能与其父对象的生命周期不同或其他各种情况,它会很有用。

由于指向 NULL 的指针在 if 中的计算结果为 false,因此您可以删除对象并将指针设置为 NULL 在某个位置,然后测试该对象是否仍然存在于另一个位置。

您收到的警告是无害的,但可能表明代码效率低下。您可能想查看它,看看您是否需要该指针或是否需要设置它。

就其良好做法而言,IMO 是为了清楚起见。当你删除一个对象时,将任何指针设置为 NULL,这样你就知道它们没有被泄露并被删除。这不是必需的,使用 auto_ptrs 或共享指针将避免整个问题。

【讨论】:

【参考方案2】:

只是猜测,警告是关于局部变量的吗?因为如果不是,我不知道编译器如何知道分配的值(NULL)没有在其他地方使用。

这是(恕我直言)问题的重要部分,因为 NULLing 指针的意义在于代码的其他部分不能(错误地)使用不再定义的地址;如果指针不能从其他任何地方(即局部变量)访问,则没有理由对其进行保护。

可以说,即使在一个函数中,防止进一步使用也有一定的价值;但良好的风格要求非常短函数,乍一看很明显,变量的使用就在那儿结束。

【讨论】:

哦,好点子,我删除了分配的空间并且指针无论如何都超出了范围,所以在这种情况下,空赋值无论如何都无关紧要,谢谢!【参考方案3】:

当指针变量指向的对象已被释放时,将它们设置为 null 是标准的,但是在这种情况下您不需要让该警告困扰您,但它对于查找已分配但从未分配的变量很有用用过

【讨论】:

【参考方案4】:

这很常见。恕我直言,这不是好的做法。

良好的做法是以您已经知道指针不能在删除后使用的方式安排您的删除操作。最好的方法是使用 RAII,即在析构函数中完成工作。一旦析构函数结束,对象不再存在,因此指针(作为数据成员)不再存在,因此它不是悬空的。

【讨论】:

抱歉我的无知,但是什么是 RAII? @blakejc70:资源获取正在初始化。基本上,这个想法是将资源封装在对象中,以便在调用对象的析构函数时将它们销毁。通过这种方式,您可以在本地范围内声明对象,而无需担心在使用完资源后会清理资源。 (它们在作用域结束时被清理。)这是某些类型的智能指针的基础,例如 auto_ptrscoped_ptr 太棒了,谢谢。我想我之前听说过一些关于它的事情,但我从来没有听说过它被称为那样的东西。

以上是关于我应该在删除后分配我的指针 0 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我可以删除以前动态分配但使用不同指针的内存吗?

cvrelease 会删除分配的内存吗?

指针在删除它并在c ++中再次分配新内存后是不是获得相同的内存地址?

将指针分配给指针(并将指针传递给类)时使用删除的 C++ 混淆

调整动态分配的指针数组的大小(复制构造函数不起作用?)

指向动态二维字符数组的三重指针的内存分配