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

C++ 为什么建议删除指针后将其设置为null?,c++,pointers,C++,Pointers,我的书告诉我,在删除指针指向的内容后,将指针设置为null或0是一种很好的做法。我不明白为什么。有人能给我一个可能导致问题的场景吗?这样你就知道指针不再指向任何东西,如果条件和其他布尔检查: int* ptr = new int(); delete ptr; ptr = 0; // or null 虽然如果指针未设置为NULL,则会导致内存损坏,但此代码运行正常。只是为了让您知道指针不再指向任何对象,如果条件和其他布尔检查: int* ptr = new int(); delete ptr;

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

这样你就知道指针不再指向任何东西,如果条件和其他布尔检查:

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

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

只是为了让您知道指针不再指向任何对象,如果条件和其他布尔检查:

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

虽然如果指针未设置为NULL,则会导致内存损坏,但此代码运行良好。

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

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

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

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

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

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

   delete ptr;
   ptr = NULL;
   if(ptr)
     *ptr = 2;
稍后,如果在指针上调用delete,则仍然可以调用更改指针中存储的值的函数

int * blah = new int();

void changeBlah( void )
{  
  if( blah )
  {
    *blah = 1337;
  }
}
此函数将运行并变得未定义,因为您将在不拥有的内存上写入

delete blah;
changeBlah();

现在,代码将毫无问题地运行。

如果在代码的其他地方引用该指针,会怎么样

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

   delete ptr;
   ptr = NULL;
   if(ptr)
     *ptr = 2;
稍后,如果在指针上调用delete,则仍然可以调用更改指针中存储的值的函数

int * blah = new int();

void changeBlah( void )
{  
  if( blah )
  {
    *blah = 1337;
  }
}
此函数将运行并变得未定义,因为您将在不拥有的内存上写入

delete blah;
changeBlah();

现在,代码将毫无问题地运行。

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

delete blah;
blah = 0;
changeBlah();

如果删除时未设置为0,则永远不能使用这种构造。

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

delete blah;
blah = 0;
changeBlah();

如果删除时未设置为0,则永远无法使用这种构造。

相关帖子:,原因很多。我认为最重要的原因是良好的实践:其他原因包括1目的明确,2容易调试空指针更容易看到,3更好的错误处理空指针会更快崩溃,初始化的垃圾指针可能稍后崩溃,etc ETCIM重要的一点:确保尽可能认真地将指针设为NULL,但不要仅仅因为指针不为NULL就依赖它,这并不意味着它一定有效。保罗:我认为这是一种不好的做法。它隐藏的问题比修复的问题多。它还会导致可能导致崩溃的问题被移动到代码中的其他位置,并且仍然会崩溃,但现在您很难找到原始问题。不要这样做。坏习惯。唯一好的做法是确保删除的任何变量立即离开作用域,因此不会无法使用。请另找一本书。管理指针需要仔细的设计,而不是本地黑客。例如:int*p=newint;int*q=p;删除p;p=0;你猜怎么着?ifq不会把你保存在这里。相关帖子:,原因很多。我认为最重要的原因是良好的实践:其他原因包括1目的明确,2容易调试空指针更容易看到,3更好的错误处理空指针会更快崩溃,初始化的垃圾指针可能稍后崩溃,etc ETCIM重要的一点:确保尽可能认真地将指针设为NULL,但不要仅仅因为指针不为NULL就依赖它,这并不意味着它一定有效。保罗:我认为这是一种不好的做法。它隐藏的问题比修复的问题多。它还会导致可能导致崩溃的问题被移动到代码中的其他位置,并且仍然会崩溃,但现在您很难找到原始问题。不要这样做。坏习惯。唯一好的做法是确保删除的任何变量立即离开作用域,因此不会无法使用。请另找一本书。管理指针需要仔细的设计,而不是本地黑客。例如:int*p=newint;
int*q=p;删除p;p=0;你猜怎么着?ifq在这里救不了你。这是一个多么惊人的答案。这是一个多么惊人的答案。你能进一步说明它是如何导致内存损坏的吗?如果ptr没有设置为null,那么*ptr=2不就是指向2吗?问题出在哪里?当他可以使用智能指针时,他为什么要使用指针?当您调用delete时,delete不会更改指针的地址。因此,如果您访问该地址并对其进行写入,您将写入已删除的内存。您能否详细说明它将如何导致内存损坏?如果ptr没有设置为null,那么*ptr=2不就是指向2吗?问题出在哪里?当他可以使用智能指针时,他为什么要使用指针?当您调用delete时,delete不会更改指针的地址。因此,如果您访问该地址并对其进行写入,您将写入已删除的内存。