回 帖 发 新 帖 刷新版面

主题:[原创][讨论]尝试解释一个大家都觉得疑惑的问题

见得多的一个比较大脑袋的问题:
定义一个函数,在函数内部申请一块内存空间(通过malloc函数(C++中对应为new))并对其进行赋值,然后通过指针返回内存块首地址(此指针变量是函数局部的),结果往往是主调函数能正常使用被调函数申请、赋值的空间,正是这一点,使大家百思不得其解,因为它似乎违背了“函数调用结束,内部申明的自动变量亦释放”。

解释之前弄懂几句术语:
对内存分配上的“栈 stack”和“堆 heap”简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。

由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的内存一定要自己释放。用free释放,不然就是“内存泄露”--像函数fun1那样;而fun1函数中定义的数组是栈内存分配,函数结束后系统自动收回内存区域,所以我们看到的输出是不可预料的。(所以 大家一定要注意malloc和free成对使用(C++中对应为new和delete))

表达能力及专业知识不够强、可能解释不够准确,大家发表发表下自己的看法。

/*例程*/
#include <stdio.h>
#include <malloc.h>

int *fun1(int); /*fun1通过malloc函数申请内存 返回首地址*/
int *fun2(void);/*fun2通过定义数组申请内存 返回首地址*/

void main()
{
    int i, n=10, *p;

    p=fun1(n);
    for(i=0;i<n;i++)
        printf("%d ",p[i]);/*输出结果为1 2 3 4 5 6 7 8 9 10*/

    p=fun2();
    for(i=0;i<n;i++)
        printf("%d ",p[i]);/*输出结果不可预料*/
}

int *fun1(int size)/*堆内存分配*/
{
    int i, *po;
    po=(int*)(malloc(sizeof(int)*size));

    for(i=0;i<size;i++)
        po[i]=i+1;
    
    return po;
}

int *fun2()/*栈内存分配*/
{
    int *po=NULL,a[]={1,2,3,4,5,6,7,8,9,10};
    po=a;
    return po;
}

回复列表 (共16个回复)

沙发

沙发!
专业能力很强
表达能力很强
照单全收了


不过fun1用malloc申请的内存用完后怎么没有free啊

板凳

之所以没有free是用来说明“malloc系统函数分配的内存就是从堆上分配内存”这一点的,是有意而为之的。

3 楼

那也应该用完后在main函数中free的,不然就象楼主说的会有“泄漏”的

4 楼

为什么说"stack一般是静态分配内存"的呢?

5 楼

问题出来了!  在某个局部函数中用new申请的内存能在其他函数中释放吗?

6 楼

能,只要在其他函数中能得到该块内存空间的地址。

7 楼

不错!
大有感悟!!!

8 楼

支持

9 楼

以前的确为此疑惑过,一直都不太清楚,谢谢楼主~!~!

10 楼

明白了
谢谢楼主
不用free函数释放由malloc申请的空间也没有关系
因为当你下次再用malloc申请空间的时候又会赋值给申请的空间
所以不用free函数也没有关系
是不是这样的楼主

我来回复

您尚未登录,请登录后再回复。点此登录或注册