使用指针的c++

C++ working with pointers

本文关键字:c++ 指针      更新时间:2023-10-16

我不明白为什么它输出"123",即使deletenode函数设置x为NULL。

#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不修改指针,它修改(或者更确切地说,清除)指针

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

void deletenode(node*& a)

然而,有一个共识,即在删除后设置指向nullptr(或NULL)的指针并没有真正帮助,因此通常不这样做。因此,我将用一个简单的delete x;语句替换您对deletenode的整个调用。

虽然您已经成功地删除了您想要删除的对象,但是指针本身是通过value(复制到变量'a')传递给deletenode()的。因此,即使函数中的变量'a'为null,变量'x'仍然指向现已删除的内存。

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

你将这个指针通过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';
  }
}