我应该在删除后指定我的指针0吗?

时间:2010-12-01 02:59:42

标签: c++ pointers compiler-warnings

  

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

我的教授告诉我们,在删除指向的分配空间后,将指针设置为0是一个好习惯,而且我一直试图养成这样做的习惯。但是当我这样做时,我的编译器会发出警告:

  

警告W8004 LinkedList.h 102:'nPtr'   被赋予一个从未使用过的值   在功能上   链表::删除(int)的

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

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

4 个答案:

答案 0 :(得分:9)

很常见。恕我直言,这不是好习惯。

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

答案 1 :(得分:0)

当指针变量已被释放时,将指针变量设置为null是标准的,但在这种情况下你不需要让那个警告错误,但它对于找到分配给的变量是有用的但是从不使用

答案 2 :(得分:0)

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

这是(恕我直言)这个问题的重要部分,因为NULL指针的重点是代码的其他部分不能(错误地)使用不再定义的地址;如果指针不能从其他任何地方访问(即局部变量),那么没有理由防止它。

可以说,即使在一个功能中,也有一些防止进一步使用的价值;但是好的风格决定了非常的短函数,乍一看,变量的使用在那里结束了

答案 3 :(得分:0)

取决于。

正如Karl所说,你应该安排你的删除,这样你就不会冒使用已经删除的指针的风险,如果一个对象的生命周期与其父对象或其他各种情况不同,那么它会很有用。 / p>

由于指向NULL的指针将在if中评估false,您可以删除对象并在一个点处将指针设置为NULL,然后测试对象是否仍存在于另一个点。

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

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