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

我的书告诉我,在删除指针指向的内容后将指针设置为 null 或 0 是一种很好的做法。我不明白为什么。有人可以给我一个可能导致问题的场景吗?

4

5 回答 5

5

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

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

此代码将运行得非常好,尽管如果指针未设置为 NULL 会导致内存损坏。

于 2013-05-15T19:18:58.900 回答
5

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

于 2013-05-15T19:19:02.673 回答
3

如果您在代码的其他地方引用该指针怎么办?

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

int * blah = new int();

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

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

delete blah;
changeBlah();

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

delete blah;
blah = 0;
changeBlah();

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

于 2013-05-15T19:19:31.637 回答
1

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

于 2013-05-15T19:18:59.607 回答
1

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

if(myPointer)
  value = *myPointer;

如果你在删除时没有设置为 0,那么你永远不能使用这种构造。

于 2013-05-15T19:20:26.163 回答