繁体   English   中英

C ++使用指针

[英]C++ working with pointers

我不明白为什么即使deletenode函数将x设置为NULL也会输出“ 123”。

#include <iostream>;
using namespace std;
struct node {int value; struct node *left,*right,*parent;};
void deletenode(node *a) {
    delete a;
    a=NULL;
}
int main(int argc, const char * argv[])
{
    node *x = new node;
    x->value=123;
    deletenode(x);
    if (x!=NULL) cout << x->value;
}

您具有以下签名: void deletenode(node *a) 您将指针x传递给函数。 指针值将被复制 在函数内部,您可以通过a = NULL写入本地指针值来修改它。

但是,该修改发生在副本上。 原稿保持不受影响。 请注意,对于delete并非如此,因为delete不会修改指针,而是会修改(或更确切地说,清除) pointee

表面的解决方案是通过引用传递指针值:

void deletenode(node*& a)

但是,有一个共识,即删除后将指针设置为nullptr (或NULL )并没有真正的帮助,因此通常无法完成。 因此,我将用简单的delete x;替换整个对deletenode调用delete x; 声明。

尽管您已经成功删除了想要的对象,但是指针本身通过值(复制到变量“ a”)传递给deletenode()。 因此,即使函数内的变量“ a”为空,变量“ x”仍指向现在已删除的内存。

因为使用delete删除实际上是将内存标记为空闲并可以重用,但是该区域的内容可能保持不变

您将此指针传递给函数BY VALUE-这意味着您将看不到函数外部的更改。 尝试通过引用传递它。

#include <iostream>

template<typename T>
void destroy(T*& ptr) {
  delete ptr;
  ptr = NULL;
}

template<typename T>
struct node {
  node(T t) : value(t) { }
  ~node() {
    delete left;
    delete right;
  }
  T value;
  struct node *left,*right,*parent;
};

int main(int argc, const char * argv[]) {
  node<int> *x = new node<int>(123);

  destroy(x);

  if (x != NULL) {
    std::cout << x->value << '\n';
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM