转载自: http://bbs.youkuaiyun.com/topics/390301360
#include <iostream>
using namespace std;
int main()
{
int *map;
int i=10;
while(i--)
{
map=new int[20];
map[i]=i;
cout << map[i]<<endl;//1
delete [] map;
cout << map[i]<<endl;//2
}
}
输出结果
9
9
8
8
7
7
6
6
5
5
4
4
3
3
2
2
1
1
0
0
请问这是怎么回事?delete为何不工作,查看第n次new ,map还是同样的地址阿!
答: 东西扔垃圾筒里,意思就是不要了,但兴许你还能把它捡回来.
首先这代码你本身就是有问题, cout << map[i]<<endl;//2虽然这语句可以读取数据,但是为定义的,因为windows在这个堆区已经进行了回收,只是还没有重新利用而以,如果其他地方分配了内存,刚好在这里,则map[i]就是未知数据了。
N次new分配的地址相同, 那是内存管理的事,在你程序运行过程中, 这个区域正好没有被其它地方申请走,所以你再申请,系统又把这块内存给了你,
如果你每次new的内存大小不同, 或者new一次过一会再new,可能就会发现地址不同了.
delete后真正的内存可能被释放掉,也可能没被释放掉。
这个看情况,因为new是在堆上申请内存,堆有自己管理内存的方式:
一般是有个叫做freelist的链表,该表保存着被释放的内存(当然如果特大的内存会被立即释放),
该freelist是后进先出队列,下次分配内存时,堆优先查找该freelist表进行分配,
当然该表也会被垃圾回收,就是对该freeList进行合并处理,合并后发现大块内存,可能会被释放。
至于什么时候执行,各个堆的实现是不一样的。