假设我有一个如下定义的节点结构:
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;
有人可以解释这个差异或指出我正确的方向吗?
答案 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!");