读书人

delete [] 地图不会立即释放内存

发布时间: 2012-12-21 12:03:49 作者: rapoo

delete [] map不会立即释放内存?

#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还是同样的地址阿!
[最优解释]
连续调用两次试试,你就知道第一次工作了没
delete [] map;
delete [] map;
[其他解释]
    cout << map[i]<<endl;//1
delete [] map;
cout << map[i]<<endl;//2


delete释放了内存,但是你的map还是指向那块内存,所以map[i]的值还是会取出来的
[其他解释]
引用:
delete了。系统不会清空内存,而是只是把该内存标记为未使用?

当你打算把一张桌子扔掉的时候,你会先把它擦干净再扔掉吗?
清空内存?清空内存跟修改内存有什么区别吗?你修改内存是为了使用它,清空一块你已经不需要用的内存,除了浪费CPU之外还有什么用?
[其他解释]
N次new分配的地址相同, 那是内存管理的事,在你程序运行过程中, 这个区域正好没有被其它地方申请走,所以你再申请,系统又把这块内存给了你,

如果你每次new的内存大小不同, 或者new一次过一会再new,可能就会发现地址不同了.


[其他解释]
是把那块置成可用块了,而不是初始化成0了,如果现在有个程序申请空间,很有可能会覆盖你原先delete掉的区域,这时候你输出就不同了
[其他解释]
引用:
delete了。系统不会清空内存,而是只是把该内存标记为未使用?


是的。
所有很多代码在delete完以后会将原来的指针赋值NULL。

delete [] map;
map = NULL;

[其他解释]
东西扔垃圾筒里,意思就是不要了,但兴许你还能把它捡回来.
[其他解释]
delete [] map 后,map的值没变,但是map指向的内存被标记为不可用的,虽然可以读取,但是不可以在进行map[*] = **赋值了...
[其他解释]
楼主知道“释放内存”是什么意思吗?
[其他解释]
会 。
[其他解释]
delete了。系统不会清空内存,而是只是把该内存标记为未使用?
[其他解释]
错错。释放内存后,那部分内存就是available的,可用的。
至于指针=NULL,完全是为了编程方便(所谓野指针)。

ptr = NULL;

if(ptr != NULL){
delete ptr;
}
[其他解释]
能再访问是一种侥幸.
[其他解释]
引用:
ptr = NULL;

if(ptr != NULL){
delete ptr;
}


delete 前判断是否为NULL,这是多此一举啦

delete NULL指针是合法的,不会有错误的


[其他解释]
引用:
delete了。系统不会清空内存,而是只是把该内存标记为未使用?



就是这么个情况,但也没法保证系统不去清空的
[其他解释]
引用:
引用:ptr = NULL;

if(ptr != NULL){
delete ptr;
}

delete 前判断是否为NULL,这是多此一举啦

delete NULL指针是合法的,不会有错误的


更正:free 空指针合法,delete 则不是
[其他解释]
引用:
错错。释放内存后,那部分内存就是available的,可用的。
至于指针=NULL,完全是为了编程方便(所谓野指针)。

ptr = NULL;

if(ptr != NULL){
delete ptr;
}


是为了编程方便。不光在delete的时候。
在多层嵌套传递后,也方便查问题。个人认为delete后,再置为NULL是很好的编程习惯。
[其他解释]
引用:
引用:ptr = NULL;

if(ptr != NULL){
delete ptr;
}

delete 前判断是否为NULL,这是多此一举啦

delete NULL指针是合法的,不会有错误的


那delete []ptr呢。
[其他解释]
cout << map[i]<<endl;//1
delete [] map;
cout << map[i]<<endl;//2
首先这代码你本身就是有问题, cout << map[i]<<endl;//2虽然这语句可以读取数据,但是为定义的,因为windows在这个堆区已经进行了回收,只是还没有重新利用而以,如果其他地方分配了内存,刚好在这里,则map[i]就是未知数据了。



[其他解释]
引用:
那delete []ptr呢。


我在 #12 楼更正了。因为楼主的例子只是整型,我不留神就把 delete 等同成 free 了。
[其他解释]
是不是我new的内存每次较少,所以内存管理没有直接回收,而是放在那里(好像在哪里见过)。如果是很大的内存,下次就应该不会“幸运的”重新拿到想通的内存地址了呢. 我也明白差不多了。谢谢各位!
[其他解释]
用vs2008编译第二个cout出来的是-17891602,这什么值,你懂的
[其他解释]
引用:
cout << map[i]<<endl;//1
delete [] map;
cout << map[i]<<endl;//2
首先这代码你本身就是有问题, cout << map[i]<<endl;//2虽然这语句可以读取数据,但是为定义的,因为windows在这个堆区已经进行了回收,只是还没有重新利用而以,如果其他地方分配了内存,刚好在这里,则map[i]就是未知数……


比较赞同
[其他解释]
建议跟踪内存看看,我在本机delete []map后,系统重新填充了随机值
[其他解释]
楼主提供了一段垃圾到不能再垃圾的代码~~
PS. 楼主所问的是一个简单的野指针问题。。。
[其他解释]
释放内存是操作系统的工作。合适释放是操作系统说了算的。
而c++是一门语言,语言顶多就是delete的时候告诉操作系统,这部分内存我不要了。
此时操作系统会将这个内存打上一个标签(可以释放)。
至于合适释放,看操作系统的情况,一般不会马上释放,很可能操作系统会等比较空闲的时候去释放,或者急需内存分配的时候去释放,这个说不准。
[其他解释]
delete仅仅是告诉操作系统,这不内存,我不用了,您老人家可以分配给其他的应用。

delete后,内存地址还是存在的。也许如同很多人说的那样,操作系统还没回收,虽然通知了操作系统


[其他解释]
没有人会设计这样一个编译器:释放内存时, 自动将释放过的内存从新写入无用的数据(例如充0)。。。除了浪费时间 这样毫无意义

[其他解释]
好像不是用这个。。。使用虚函数吧。。。。
[其他解释]
delete []map;释放的是内存地址,而不是内存存储的内容。所以内存存储的内容可能不会改变。如果你没有delete,那么这段内存就不能再被分配到其他地方。

读书人网 >C++

热点推荐