Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 澄清C/C+中的悬空指针+;_C++_Dangling Pointer - Fatal编程技术网

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或类似值是一种反模式。只是不要取消对悬空指针的引

我对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
或类似值是一种反模式。只是不要取消对悬空指针的引用


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()范围之外(不可访问)