delete后做了什么

转载自:  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进行合并处理,合并后发现大块内存,可能会被释放。
至于什么时候执行,各个堆的实现是不一样的。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值