| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1305 人关注过本帖
标题:论坛内存在的关于内存泄露的问题
只看楼主 加入收藏
gao_guai
Rank: 2
等 级:论坛游民
帖 子:73
专家分:16
注 册:2011-6-5
收藏
 问题点数:0 回复次数:14 
论坛内存在的关于内存泄露的问题
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"string.h"
#define N 20000
//#define NULL 0
int *p1,*p2;
int i;
int num[10];
void gen_rand (int band)                            //产生随机数,存储在分配的空间中
{   
    for(i=0;i<N;i++)
    {
        *p1 = rand() % band;
        printf("%d  ", *p1);
        p1++;
    }
}
void display()                               // 显示输出统计函数
{
    for(i=0;i<10;i++)
    {
        printf("The number of %d is:  ",i);
        printf("%d\n",num[i]);
    }
}
void stat(int *p)                         //统计随机数中每个数出现的次数
{
        p=p2;
        for(i=0;i<N;i++)
        {
            switch (*p)
                {
                    case 0: num[0]++;
                                break;
                    case 1: num[1]++;
                                break;
                    case 2: num[2]++;
                                break;
                    case 3: num[3]++;
                                break;
                    case 4: num[4]++;
                                break;
                    case 5: num[5]++;
                                break;
                    case 6: num[6]++;
                                break;
                    case 7: num[7]++;
                                break;
                    case 8: num[8]++;
                                break;
                    case 9: num[9]++;
                                break;
                    default :break;
                }
            p++;
        }
}
void main()
{
    p1=(int *)malloc(N * sizeof(int));                //分配空间
    if(p1==NULL)
    {
        printf("Malloc memoryspace failed.");
        exit(1);
    }
    p2=p1;                        
    memset(p1,0,N * sizeof(int));                    //初始化内存
    gen_rand(10);
    stat(p1);
    display();
    free(p1);
    free(p2);
    p1=NULL;
    p2=NULL;
    getch();
}
为什么注释掉红的语句之后,整个程序没有问题了,?这个到底是怎么内存泄露了?假如有这个一个函数

int a()

{
char *p=malloc(4);

.....

free(p);
}

最后的这个free(p);还用写吗?它的生命周期不就是在这个函数内部吗?如果函数被调用结束后,这个p是会自动释放的吧?!


搜索更多相关主题的帖子: void display include number 
2012-06-15 15:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
花括号内的变量自动释放,是编译器编译期间用自动变量机制分配管理的,自动创建、自动释放。但malloc()内配的内存,是程序在运行期间向操作系统申请的,数据在堆内存中,你主动申请,就归你主动释放。

在你那个函数a()中,虽然内存是在函数花括号内部申请的,但数据却在程序外部,别说函数使用完毕,就算是程序结束,操作系统没有收到申请者要求释放的信号,它都不会动这块内存,仍然归申请者所有。

授人以渔,不授人以鱼。
2012-06-15 16:28
gao_guai
Rank: 2
等 级:论坛游民
帖 子:73
专家分:16
注 册:2011-6-5
收藏
得分:0 
回复 2楼 TonyDeng
不是说关掉程序之后,os会自动回收内存么?难道这里的内存指的是栈的?不是吧!!而且如果你运行多次这个程序,程序中的变量分配的内存应该也是不一样的吧,这里的内存应该是包括堆和栈吧


[ 本帖最后由 gao_guai 于 2012-6-18 09:46 编辑 ]
2012-06-18 09:38
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
如果os能自动回收,那为啥还用malloc呢,还分堆和栈呢

总有那身价贱的人给作业贴回复完整的代码
2012-06-18 10:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用.NET框架的才自动回收,普通的内嵌C没有自动回收由malloc()申请的内存的机制。

授人以渔,不授人以鱼。
2012-06-18 13:01
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
你这个是同一块内存二次释放引起的。两个free去释放同一块内存,与内存泄露无关。
函数内,变量的生命周期是结束了,可是不写最后一句free,才真的是内存泄露。

我们都在路上。。。。。
2012-06-18 13:07
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用embed_xuel在2012-6-18 10:09:40的发言:

如果os能自动回收,那为啥还用malloc呢,还分堆和栈呢
理论上 一个进程结束后进程所拥有的那些东西都会被回收

但这是理论上、、、
2012-06-18 13:15
gao_guai
Rank: 2
等 级:论坛游民
帖 子:73
专家分:16
注 册:2011-6-5
收藏
得分:0 
谢谢各位了
2012-06-18 15:43
gao_guai
Rank: 2
等 级:论坛游民
帖 子:73
专家分:16
注 册:2011-6-5
收藏
得分:0 
回复 6楼 hellovfp
那为什么只去掉free(p2)还不对呢,非得去掉free(p1 ),他们不都指向一个内存么
2012-06-18 15:44
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
收藏
得分:0 
回复 9楼 gao_guai
因为你在get_rand()操作中,你修改了p1指向的内存。所以,p1和p2实际上已经指向不同的地方了。
而释放内存时,free传入的参数必须是malloc返回的地址。所以,此时只能通过free(p2)来释放了。
此外,通过malloc分配的内存只能释放一次,不同重复释放。也就是说,假设你前面的都正确,p1和p2都指向malloc分配的内存,同时free(p1);free(p2);这样也是有问题的。
2012-06-18 16:49
快速回复:论坛内存在的关于内存泄露的问题
数据加载中...
 
   



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

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