删除的指针仍然指向旧数据
Posted
技术标签:
【中文标题】删除的指针仍然指向旧数据【英文标题】:Deleted pointer still pointing the old data 【发布时间】:2016-03-29 12:47:08 【问题描述】:我认为删除指针指向的内存应该用零覆盖。(不确定) 但它仍然指向 int 值 10 和相同的地址。怎么回事?
int *p = new int;
*p = 10;
cout << *p << endl; //10
cout << p << endl; //0x7fafc3c02e80
delete p;
cout << *p << endl; //10
cout << &(*p) << endl; //0x7fafc3c02e80!
return 0;
【问题讨论】:
删除指针不会改变它指向的地址。它只是释放曾经分配的内存,因此可以再次使用它。此外,取消引用已删除的指针是未定义的行为。 您将信用卡号写在一张纸上。你把它揉成一团,扔进废纸篓。别人把它拿出来,把纸弄皱,然后读你的信用卡号。这是怎么回事? (不是一个完美的类比,部分原因是在 C++ 的情况下,通常甚至不会发生任何皱缩。) 删除指针表示the memory becomes available again for other requests of dynamic memory.
.
*p
在delete p
之后是未定义的行为。它可能会给你一次有意义的价值,但下次你尝试你的电脑时可能会爆炸。只是不要这样做。
哈哈好的,谢谢大家。我再也不会这样做了。但还有一件事。那么它如何检测内存是否被删除并允许使用?否则除了执行delete
关键字之外,其他都和以前一样
【参考方案1】:
delete 操作符释放指针指向的内存。一旦空闲,它就可以随时重新分配,因此访问该指针将产生不可预知的结果。在您的程序中,只是内存尚未重新分配给其他任何东西的情况。
https://msdn.microsoft.com/en-us/library/h6227113.aspx
具体来说:
“在对象上使用 delete 运算符会释放其内存。在对象被删除后取消引用指针的程序可能会产生不可预知的结果或崩溃。 当 delete 用于为 C++ 类对象释放内存时,对象的析构函数会在对象的内存被释放之前被调用(如果对象有析构函数)。”
【讨论】:
【参考方案2】:您已返回分配给空闲堆池的空间。这并不意味着某些东西会向它写入零。这需要时间,而且您可能不想在该任务上花费时间。
我想某些类型可能有析构函数,可以在销毁期间清除它们的存储,但 int
没有。
如果您确实想删除数据,请在致电delete
之前自行清除
在你告诉系统你用完之后继续使用内存也是一个坏主意。
因此,您可以选择在 delete
之后将指针设置为 NULL
,如果您搞砸并尝试使用旧指针,这将有助于导致异常。
【讨论】:
【参考方案3】:您不会删除指针的实际value
或其指向的值。您只是释放内存,因此“稍后”的其他指针将能够指向同一位置。
【讨论】:
严格来说,指针甚至不需要指向同一个点。释放的内存也可以在后续分配的中间使用。 @cad 100% 正确。但不是像这样的菜鸟问题 菜鸟问题需要简化,所以更不精确、抽象的解释会更好。明显的错误对新手有害,尤其是对新手。以上是关于删除的指针仍然指向旧数据的主要内容,如果未能解决你的问题,请参考以下文章