我的问题:指针和动态内存分配
int* x = new int;
cout << x<<"\n";
int* p;
cout << p <<"\n";
p = x;
delete p;
cout << p <<"\n";
我写这纯粹是我自己了解指针和理解(也迷失在)的动态new
和delete
。
我的XCode可以编译程序并返回结果如下:
0x100104250
0x0
0x100104250
我知道,我只能叫删除动态分配的内存。 但是,我在上面的程序中调用了p
上的删除并编译。
任何人都可以向我解释这个吗? 为什么我可以删除p
?
而且,我发现如果程序更改为以下几点:
int* x = new int;
int* p;
cout << p <<"\n";
delete p;
cout << p <<"\n";
然后我的Xcode再次编译并返回我:
0x0
0x0
Program ended with exit code: 0
,现在,我得到了完全失去:( 请问谁能解释一下吗? 为什么我可以删除p
,因为它跟x
没什么关系?
由于Xcode编译成功,我假设上述两个程序对于计算机是正确的。 但是,我认为这又是“仅在动态分配内存上调用删除”的说法。 或者可能,我没有完全理解什么是指针,什么是动态分配的内存。我在网上搜索时发现这个post。 但我不认为这是我的情况。
请帮我一把。
我想问一个问题。关于二叉搜索树的代码是here。 从第28行到第32行,它处理删除一个孩子的节点。 我把这部分代码放在这里,以防万一网页链接不起作用。
否则如果(根 - >左== NULL){ 结构节点*温度=根; root = root-> right; 删除温度; }
正是这些代码导致我问关于指针的问题上面。 按照这篇文章给出的答案。 以下列方式了解代码是否正确?
我不能先将根的父节点链接到根的右子节点。 ,然后删除根节点,因为根节点下的子树也将被删除。 所以我必须创建一个临时指针,指向由root指向的内存插槽。 然后我将根的父节点链接到根的右子节点。 现在,我可以安全地删除由“root”指向的内存插槽(即温度,因为它们都指向相同的内存)。 通过这种方式,我释放内存并保持父母与子女之间的联系。 另外,temp仍然存在,仍然指向“那个”内存插槽。 删除后应该将它设置为NULL吗?
再次提前谢谢大家。
腰封
在你的第二个代码示例中,你是“幸运的”,p'是'0'。由于它未初始化,它可能有任何价值。因为它是'0'(又名'NULL'),所以调用'delete'是有效的(这有助于避免对NULL进行一百万次检查,特别是在处理分配失败的错误情况时,并且您希望清理其余的分配 - 如果所有的指针首先被初始化为NULL,那么你可以删除所有的东西,而不用担心哪个分配失败。 – 2014-12-08 08:22:07
只是一个建议,你总是应该初始化你的指针变量,如int * p = 0;或者int * p = NULL;这是因为在调试版本中,这将为您完成。但在发布版本中,它不会完成。这可以为您节省大量的时间调试。 – user743414 2014-12-08 08:23:24
@ user743414除非您维护遗留代码,否则您应该使用C++ 11,因此使用'int * p = nullptr;'。 (这部分)C++ 11现在已经得到所有主要编译器的支持。 – Angew 2014-12-08 08:24:51