C++ 澄清C/C+中的悬空指针+;
我对C/C中的悬空指针有点困惑++C++ 澄清C/C+中的悬空指针+;,c++,dangling-pointer,C++,Dangling Pointer,我对C/C中的悬空指针有点困惑++ void remove(){ Node* curr = new Node(10); Node* pt = curr; delete curr; // do something here // do other thing here } 我假设在函数remove()终止之前,Node*pt仍然是悬空指针 我不必担心Node*pt在remove()终止后的指针。它绝对没有什么问题,试图将所有悬空指针设置为NULL或类似值是一种反模式。只是不要取消对悬空指针的引
void remove(){
Node* curr = new Node(10);
Node* pt = curr;
delete curr;
// do something here
// do other thing here
}
我假设在函数remove()
终止之前,Node*pt
仍然是悬空指针
我不必担心
Node*pt
在remove()
终止后的指针。它绝对没有什么问题,试图将所有悬空指针设置为NULL
或类似值是一种反模式。只是不要取消对悬空指针的引用
在remove
的注释部分,但是curr
和pt
都是悬空指针,因为它们都指向已删除的对象。只要代码没有取消对它们的引用,就没有问题。您的问题似乎是基于错误的假设,即悬空指针有问题。它绝对没有什么问题,试图将所有悬空指针设置为NULL
或类似值是一种反模式。只是不要取消对悬空指针的引用
在remove
的注释部分,但是curr
和pt
都是悬空指针,因为它们都指向已删除的对象。只要代码没有取消引用,就没有问题。当您调用delete curr
时,curr
中存储的值不变,但该位置的内存已返回到系统
让我们逐行浏览您的代码:
Node* curr = new Node(10);
为了论证起见,让我们假设分配的内存具有地址0x1000,这意味着curr
现在的值为0x1000
Node* pt = curr;
pt现在也有值(指向位置)0x1000
这会将位置0x1000处的内存返回给系统。但是,此时,curr
和pt
仍然包含值0x1000
它们都是悬而未决的指针
当您使用原始指针时,悬空指针是不可避免的,它们并不是隐含的坏指针。您只需小心不要使用悬空指针或返回指针
void badfunc() {
char* p = new char[10];
delete p;
return p; // use of dangling pointer
}
调用delete curr
时,存储在curr
中的值不变,但该位置的内存已返回系统
让我们逐行浏览您的代码:
Node* curr = new Node(10);
为了论证起见,让我们假设分配的内存具有地址0x1000,这意味着curr
现在的值为0x1000
Node* pt = curr;
pt现在也有值(指向位置)0x1000
这会将位置0x1000处的内存返回给系统。但是,此时,curr
和pt
仍然包含值0x1000
它们都是悬而未决的指针
当您使用原始指针时,悬空指针是不可避免的,它们并不是隐含的坏指针。您只需小心不要使用悬空指针或返回指针
void badfunc() {
char* p = new char[10];
delete p;
return p; // use of dangling pointer
}
关于您的问题:“在函数remove()终止之前,我假设Node*pt仍然与指针纠缠?”
是,调用删除当前代码后
释放先前由Node*curr
和Node*pt
指向的内存块。调用delete curr后,不应使用curr
或pt
值代码>(它们都具有相同的值,并且无效)。不要假设对delete
的调用会更改curr
的值。没有-您可以通过在调用delete curr之前和之后打印两个值来检查它代码>如下所示:
printf(“%d,%d”,当前,pt)
关于您的问题:“在remove()终止后,我不必担心指针节点*pt?”
确实,在remove()
完成后,Node*curr
和Node*pt
将不再存在。它们也超出了remove()
之外的范围(不可访问)。因此,你不必担心他们
此外,先前由Node*curr
和Node*pt
指向的内存中存储的对象/数据由delete curr释放/销毁代码>,因此您也不必担心它
有时建议通过将指针设置为NULL来避免指针悬空。这并不能缓解问题,但如果您无意中使用了这样的指针,至少可以清楚地看到这一点。这是因为尝试取消对空指针的引用会导致内存分段错误-因此您至少会得到一个可重现的运行时错误来查找您的错误。另一些人说,盲目地将每个未使用的指针设置为NULL会使代码混乱。这里需要一些智慧来权衡利弊
关于您的问题:“在函数remove()终止之前,我假设Node*pt仍然与指针纠缠?”
是,调用删除当前代码后
释放先前由Node*curr
和Node*pt
指向的内存块。调用delete curr后,不应使用curr
或pt
值代码>(它们都具有相同的值,并且无效)。不要假设对delete
的调用会更改curr
的值。没有-您可以通过在调用delete curr之前和之后打印两个值来检查它代码>如下所示:
printf(“%d,%d”,当前,pt)
关于您的问题:“在remove()终止后,我不必担心指针节点*pt?”
确实,在remove()
完成后,Node*curr
和Node*pt
将不再存在。它们也不在remove()范围之外(不可访问)