设置节点等于NULL与删除节点之间的区别

时间:2014-03-25 18:00:35

标签: c++

假设我有一个如下定义的节点结构:

struct Node
{
int data;
Node* left;
Node* right;
}

假设我有节点节点abc和xyz以及:

abc->data = 1;
abc->right=NULL;
abc->left=xyz;

xyz->data =2;
xyz->right=NULL;
xyz->left=NULL;

稍后如果我想删除节点xyz,如果我说:

,它是否相同
delete xyz 

VS。话说:

xyz=NULL;

有人可以解释这个差异或指出我正确的方向吗?

3 个答案:

答案 0 :(得分:4)

不,它不一样。 delete X;语句实际上调用X指向的对象的析构函数,并释放/释放先前为operator new为该对象分配的内存。

X = NULL;语句只是将addres 0x0赋给指针X,既不会破坏X指向的对象,也不会释放内存而不是delete

答案 1 :(得分:2)

delete释放内存,但不清除指针。

xyz设置为NULL只清除指针,但不释放内存。

这是C ++和Java / C#/ JavaScript在其内存管理中的众多差异之一 - 在具有垃圾收集的系统中,清除上面的xyz之类的引用/指针将允许垃圾收集器以后释放记忆。 C ++(或C)没有垃圾收集,这就是为什么内存必须作为程序的一部分进行管理,否则最终会导致内存泄漏。

答案 2 :(得分:0)

正如Vlad Lazarenko上面所写,这些行动并不相同。在实际代码中,您应该使用智能指针,而不是直接调用delete运算符。

boost::shared_ptr<std::string> x = boost::make_shared<std::string>("hello, world!");
x->size(); // you can call methods of std::string through smart pointer
x.get(); // and you always can get raw pointer to std::string

现代编译器允许您编写更少的代码:

auto x = std::make_shared<std::string>("hello, world!");