为什么建议在删除指针后将其设置为null?

时间:2013-05-15 19:17:27

标签: c++ pointers

int* ptr = new int();
delete ptr; 
ptr = 0; // or null

我的书告诉我,删除指向的指针后,最好将指针设置为null或0。我不明白为什么。有人会给我一个可能导致问题的情景吗?

5 个答案:

答案 0 :(得分:5)

只是为了让你知道指针不再指向任何东西,并且如果条件和其他布尔检查将会失败:

   delete ptr;
   ptr = NULL;
   if(ptr)
     *ptr = 2;

此代码运行完全正常,但如果指针未设置为NULL,则会导致内存损坏。

答案 1 :(得分:5)

这样,如果您稍后在程序中意外再次使用ptr,则会立即导致崩溃,而不会在程序后期导致难以发现的错误。

答案 2 :(得分:3)

如果您在代码中的其他位置引用该指针会怎样?

许多开发人员使用简单的检查来确保他们仍然可以访问该指针。

int * blah = new int();

void changeBlah( void )
{  
  if( blah )
  {
    *blah = 1337;
  }
}

稍后如果你在指针上调用delete,你仍然可以调用更改存储在指针中的值的函数。

delete blah;
changeBlah();

此函数将运行并变为未定义,因为您将写入您不拥有的内存。

delete blah;
blah = 0;
changeBlah();

现在代码可以毫无问题地运行。

答案 3 :(得分:1)

因为删除空指针总是安全的。这是为了避免双重删除错误。开发人员还使用它来检查指针是否已被删除。

答案 4 :(得分:1)

如果在删除它之后总是将其设置为0,则可以在取消引用之前使用它来检查指针是否有效。所以无论你在哪里使用它,都可以检查如下:

if(myPointer)
  value = *myPointer;

如果在删除时没有设置为0,则永远不会使用这种结构。