标题:free/delete真的把动态内存的释放完了吗?
只看楼主
TGM316750432
Rank: 2
来 自:河南周口
等 级:论坛游民
帖 子:56
专家分:97
注 册:2010-8-27
结帖率:75%
已结贴  问题点数:8 回复次数:7 
free/delete真的把动态内存的释放完了吗?

#include <iostream>  
#include <malloc.h>  
  
using namespace std;  
main()  
{  
    int arraysize; //元素个数  
    int *array; //用于动态开辟数组的指针变量  
  
    cin>>arraysize;  
    array=(int*)malloc(arraysize * sizeof(int));//利用malloc在堆内存中开辟内存空间,它的大小是元素的个数乘以该数据类型的长度  
  
    for(int i=0;i<arraysize;i++)   
    {  
        array[i]=i;  
    }  
  
    for(int i=0;i<arraysize;i++)  
    {  
        cout<<array[i]<<",";  
    }  
    cout<<endl;  
    free(array);//利用free释放动态开辟的堆内存空间
 
    for(int i=0;i<arraysize;i++)  
    {  
        cout<<array[i]<<",";  
    }  
    cout<<endl;  
     
    cin.get();  
    cin.get();  
}


如果输入数组长度为5   free前输出结果为0,1,2,3,4 free后输出为   5252072(不确定的数),5246776(不确定的数),2,3,4    为什么动态内存free后仍可以访问第二个以后的数据?free是不是只释放了前两个数据?
搜索更多相关主题的帖子: 内存 delete free 动态 释放 
2010-10-15 21:29
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:605
专家分:2489
注 册:2009-4-8
得分:0 
我现在只知道一点,楼主看到的现象跟编译器有关。

迭代的是人,递归的是神。
2010-10-15 22:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:2 
首先你得知道释放是什么意思。释放就是把这段内存标记成可用状态,或者说,没有人在用这段内存了。至于里面的值,事实系统并不关心。
释放之前,如果这段内存你没改过但其中的值变了,那是系统玩忽职守。你释放了之后,里面的值变成什么,系统就不管了。
2010-10-15 22:38
cacker
该用户已被删除
得分:2 
提示: 作者被禁止或删除 内容自动屏蔽
2010-10-16 00:11
y2k_connect
Rank: 2
等 级:论坛游民
威 望:1
帖 子:15
专家分:61
注 册:2009-10-4
得分:1 
在free()和for()之间的时间间隙中,如果是没有发生进程切换,array[]的数据不会发生变化。反之,array[]的数据将无法确定。
2010-10-16 06:02
TGM316750432
Rank: 2
来 自:河南周口
等 级:论坛游民
帖 子:56
专家分:97
注 册:2010-8-27
得分:0 
回复 3楼 pangding
如果动态分配的单链表  只free头指针是不是就把链表全部的内存释放了?  另外请帮忙解释下内存泄漏的定义
2010-10-16 11:18
TGM316750432
Rank: 2
来 自:河南周口
等 级:论坛游民
帖 子:56
专家分:97
注 册:2010-8-27
得分:0 
回复 3楼 pangding
如果动态分配的单链表  只free头指针是不是就把链表全部的内存释放了?  另外请帮忙解释下内存泄漏的定义
2010-10-16 11:18
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:3 
这只放头结点的内存,其它的不管。

内存泄漏广义上讲,一个程序老占着内存不放就叫。不过一般最起码的,一个程序如果占了一个它自己也用不上的内存,肯定是泄漏。
就拿你问的这个,你释放了头结点,其它的结点就很难顺序访问了。那些内存你的程序用不了了,也没还给系统,就是一种典型的内存泄漏。
一个好的程序应该尽量用有限的内存完成应做的工作,动不动就管系统要也不是好的行为。
2010-10-16 18:21



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-323016-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038968 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved