int* ptr = new int();
delete ptr;
ptr = 0; // or null
我的书告诉我,删除指向的指针后,最好将指针设置为null或0。我不明白为什么。有人会给我一个可能导致问题的情景吗?
答案 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,则永远不会使用这种结构。