[英]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.