class abc {
int x ;
};
int main()
{
abc *A = new abc ;
cout<< static_cast<void*>(A) << endl ;
delete A ;
cout<< static_cast<void*>(A) << endl ;
abc *B = new abc ;
cout<< static_cast<void*>(B) << endl ;
delete B ;
cout<< static_cast<void*>(B) << endl ;
return 0;
}
为什么它打印相同的地址,即使我删除了旧内存。
即使我在删除后分配 null ,它也会打印相同的地址。
甚至A和B的地址都是相同的。
实时场景:
Function1 ->
arr[p] = new X
ptr1 = arr[p]
using ptr1
Function2 ->
ptr2 = arr[p]
delete ptr2
arr[p] = new X ( new data)
在实际情况下 ptr1 应该无效,但因为编译器将相同的地址分配给
function2 ptr1 中的 arr[p] 仍然有效。
为什么这不应该发生?一旦您删除了特定地址处的内存,内存管理器就可以在您下次请求新内存时完全自由地重新使用该地址。事实上,这是内存管理器使用的一种非常常见的优化。他们跟踪最近释放的块并将它们返回给下一个请求该大小块的客户端。
另一种看待这个问题的方法是考虑如果释放的地址从未被重新使用会发生什么。如果发生这种情况,那么最终,在足够的分配/释放周期之后,将没有剩余的地址空间。事实上,如果重用从未发生过,那么释放内存就没有任何意义。所以是的,当您释放内存时,确实应该期望该内存地址将被重新使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)