int* ptr = new int();
delete ptr;
ptr = 0; // or null
我的书告诉我,在删除指针指向的内容后将指针设置为 null 或 0 是一种很好的做法。我不明白为什么。有人可以给我一个可能导致问题的场景吗?
只是为了让您知道指针不再指向任何东西,并且如果条件和其他布尔检查将失败:
delete ptr;
ptr = NULL;
if(ptr)
*ptr = 2;
此代码将运行得非常好,尽管如果指针未设置为 NULL 会导致内存损坏。
这样,如果您ptr
稍后在程序中不小心再次使用,它会立即导致崩溃,而不是在程序中导致难以发现的错误。
如果您在代码的其他地方引用该指针怎么办?
许多开发人员使用简单的检查来确保他们仍然可以访问该指针。
int * blah = new int();
void changeBlah( void )
{
if( blah )
{
*blah = 1337;
}
}
稍后,如果您在指针上调用 delete,您可能仍会调用更改存储在指针中的值的函数。
delete blah;
changeBlah();
该函数将运行并变得未定义,因为您将写入您不拥有的内存。
delete blah;
blah = 0;
changeBlah();
现在代码可以毫无问题地运行了。
因为删除空指针总是安全的。这是为了避免双重删除错误。开发人员还使用它来检查指针是否已被删除。
如果删除后总是将其设置为 0,则可以在取消引用之前使用它来检查指针是否有效。因此,无论您在哪里使用它,都可以进行如下检查:
if(myPointer)
value = *myPointer;
如果你在删除时没有设置为 0,那么你永远不能使用这种构造。