gpt4 book ai didi

c++ - 使用 new 分配内存返回相同的内存地址

转载 作者:太空狗 更新时间:2023-10-29 19:52:21 24 4
gpt4 key购买 nike

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] 仍然有效。

最佳答案

为什么不应该发生这种情况?一旦您删除了特定地址的内存,内存管理器就可以完全自由地在您下次请求新内存时重新使用该地址。事实上,这是内存管理器使用的一种非常常见的优化。他们跟踪最近释放的 block ,并将它们交还给下一个请求该大小块的客户端。

另一种看待这个问题的方法是考虑如果释放的地址从未被重新使用会发生什么。如果发生这种情况,那么最终,经过足够多的分配/解除分配周期后,将没有地址空间。事实上,如果重用从未发生,那么释放内存就毫无意义。所以,是的,当你释放内存时,该内存地址将被重新使用。

关于c++ - 使用 new 分配内存返回相同的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27167333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com