new返回的指针能否与已delete的旧new指针地址相同?两次cout输出是否始终一致?
问题解答
问题1:使用new运算符返回的指针,是否可能与之前通过new分配、随后被delete释放的指针拥有相同的地址值?
- 答案是可能。内存分配器释放一块内存后,会将其归还给可用内存池。当后续有新的内存分配请求时,如果请求的内存大小和已释放的内存块匹配,分配器很可能会复用这块内存,此时new返回的指针地址就会和之前delete释放的地址一致。不过这不是必然行为,完全取决于内存分配器的实现逻辑以及当前程序的内存使用状态。
问题2:在给定的C++代码中,两次cout语句是否总会打印出相同的地址值?
- 答案是不会。核心原因如下:
- 内存大小不匹配:第一次
new int()分配的是单个int的内存(通常为4字节),第二次new int[4]分配的是4个int的数组(通常为16字节)。如果内存分配器判断之前释放的4字节块无法容纳16字节的请求,就会从内存池的其他区域分配新内存,地址自然不同。 - 分配器无强制复用规则:即使后续请求的内存大小和已释放块匹配,C++标准也没有要求内存分配器必须复用该地址。不同操作系统、编译器自带的分配器行为不同,甚至同一分配器在不同内存使用场景下,也可能选择分配新内存块而非复用已释放的地址。
- 内存大小不匹配:第一次
原代码如下:
#include<bits/stdc++.h> using namespace std; int main(){ int* p = new int(); *p = 54; cout<<p; // it displays the address of int in heap(); delete(p); p = new int[4]; cout<<p; // it displays the address of first block of memory, of array in heap; return 0; }
内容的提问来源于stack exchange,提问作者spyderidle
相关产品推荐
相关产品推荐

