函数中的malloc空间是否要释放

caiwei_cs 2014-09-12 01:41:13
我在子函数里面做一个动态链表。
链表的节点都是malloc出来的。

我在删除节点和退出函数之前是否要依次查找这些节点并free他们呢?
在子函数中不free是否会造成malloc在函数退出后也不会被回收??
...全文
2115 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
卞爱华 2014-09-17
  • 打赏
  • 举报
回复
申请的权限给你,就是要你对它的生命期负责
xian_wwq 2014-09-15
  • 打赏
  • 举报
回复
引用 2 楼 caiwei_cs 的回复:
[quote=引用 1 楼 modyaj 的回复:] 有申请就要释放!
如果在子函数里面,是不是会像局部变量一样,在函数结束后自动释放呢? 因为这些空间里面的东西我也不需要了,被系统自动收回也无所谓。[/quote] 自动释放的是在栈上,堆上的资源,自己申请,自己负责回收 不处理就是资源泄露
边走边瞧 2014-09-15
  • 打赏
  • 举报
回复
要释放,不然内存泄漏。
赵4老师 2014-09-15
  • 打赏
  • 举报
回复
虎头蛇尾是俗人的习惯, 有始有终是君子的操守。
summerxia1 2014-09-14
  • 打赏
  • 举报
回复
看七楼和九楼
jdq_summer 2014-09-14
  • 打赏
  • 举报
回复
一看明显是学生写的代码,说实话我也写过。工作之后就知道公司对代码要求有多严格,特别是大公司,他们都有自己的一套编码标准叫checklist。代码审核如果上述代码,直接被鄙视,而且影响转正。所以要养成良好的编码习惯,即使是测试程序,也要写规范点。网上也有相关的代码编码标准要求,华为就有一套C语言代码编写标准规范。 我也刚工作两三个月,对编码要求深有体会。
NullBasic 2014-09-14
  • 打赏
  • 举报
回复
就算会被自动回收也要手动释放,这是一个好习惯,不能一直依赖系统的回收
bear234 2014-09-14
  • 打赏
  • 举报
回复
必须释放 不用考虑 void fun() { int *p = (int *)malloc(sizeof(int) * 1); } 调用这个函数,当这个函数执行完毕后,p被释放,但p指向的空间没有被释放 想象一下你调用了N次这个函数的结果是什么.....
Kenney_Qin 2014-09-13
  • 打赏
  • 举报
回复
要释放的,凡是自己申请的内存,就要自己释放。
Morrisss_ 2014-09-13
  • 打赏
  • 举报
回复
引用 2 楼 caiwei_cs 的回复:
[quote=引用 1 楼 modyaj 的回复:] 有申请就要释放!
如果在子函数里面,是不是会像局部变量一样,在函数结束后自动释放呢? 因为这些空间里面的东西我也不需要了,被系统自动收回也无所谓。[/quote] 仅仅是你保存动态申请得到的内存地址的局部变量被销毁,但是申请的内存依旧被占用。
707wk 2014-09-12
  • 打赏
  • 举报
回复
如果是开发程序的话一定要释放,平时要养成释放空间的习惯。我老师写链表从来都不释放
小白yige 2014-09-12
  • 打赏
  • 举报
回复 1
在子函数里面动态申请的内存不会自动被系统收回的,因为这些空间在堆里面,而不是栈,平常所说的不能返回指向栈的指针,比如在子函数里面定义一个字符指针,指向常量"hello"因为函数调用完成这部分空间会自动释放,但是堆不会,所以会越积累愈多的,尤其是对这个子函数调用次数非常多就不妙了,申请的内存地址应该保证能够记住或者保证可以找到,为以后的释放做准备。
猪神川 2014-09-12
  • 打赏
  • 举报
回复
养成良好的习惯,malloc、calloc和realloc后,内存空间要释放,不释放就会出现内存泄露,写一些小程序到没什么问题发生,假如正式做项目的时候,你的程序必须一直运行,那么一直malloc却不free,一定会出问题的。
赵4老师 2014-09-12
  • 打赏
  • 举报
回复
//带表头结点的单向链表
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
struct NODE {
    int          data;
    struct NODE *next;
} H,*head,*p,*q,*s1,*s2,*s3,*s4,*s;
int i,j,k,n,t,m;
int main() {
    srand(time(NULL));

    //填写头节点数据
    H.data=-1;
    H.next=NULL;
    head=&H;

    //创建10个节点的单链表
    p=head;
    for (i=0;i<10;i++) {
        q=(struct NODE *)malloc(sizeof(struct NODE));
        if (NULL==q) return 1;
        q->data=rand()%100;//填写0..99的随机值
        q->next=NULL;
        p->next=q;
        p=q;
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //将值为5的结点插入到单链表的第k个结点前
    k=3;
    n=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;
        }
        n++;
        if (k==n) {
            q=(struct NODE *)malloc(sizeof(struct NODE));
            if (NULL==q) return 1;
            q->data=5;
            q->next=p->next;
            p->next=q;
            break;
        }
        p=p->next;
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //删除第k个节点
    k=5;
    n=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;
        }
        n++;
        if (k==n) {
            q=p->next;
            if (q) {
                p->next=q->next;
                free(q);
            }
            break;
        }
        p=p->next;
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //从小到大排序
    for (p=head;p!=NULL && p->next!=NULL;p=p->next) {
        for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {
            if (p->next->data > q->next->data) {

                //交换data
//              printf("swap %02d %02d\n",p->next->data,q->next->data);
//              t=p->next->data;p->next->data=q->next->data;q->next->data=t;

                //或者

                //交换next
//              printf("swap %02d %02d\n",p->next->data,q->next->data);
                s1=p->next;
                s2=p->next->next;
                s3=q->next;
                s4=q->next->next;

                if (s2!=s3) {
                     p->next=s3;
                    s3->next=s2;
                     q->next=s1;
                    s1->next=s4;
                } else {
                     p->next=s3;
                    s3->next=s1;
                           q=s3;
                    s1->next=s4;
                }

                //输出整个单链表
//              s=head->next;
//              while (1) {
//                  if (NULL==s) {
//                      printf("\n");
//                      break;
//                  }
//                  printf("%02d->",s->data);
//                  s=s->next;
//              }
//              getchar();
            }
        }
    }

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10
    m=4;
    n=6;
    k=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;
        }
        k++;
        if (m+1==k) {
            q=p;
        }
        s=p;
        p=p->next;
    }
    s1=head->next;
    head->next=q->next;
    s->next=s1;
    q->next=NULL;

    //输出整个单链表
    s=head->next;
    while (1) {
        if (NULL==s) {
            printf("\n");
            break;
        }
        printf("%02d->",s->data);
        s=s->next;
    }

    //释放所有节点
    p=head->next;
    while (1) {
        if (NULL==p) {
            break;
        }
        q=p->next;
        free(p);
        p=q;
    }

    return 0;
}
//18->94->58->17->27->20->43->57->75->78->
//18->94->05->58->17->27->20->43->57->75->78->
//18->94->05->58->27->20->43->57->75->78->
//05->18->20->27->43->57->58->75->78->94->
//43->57->58->75->78->94->05->18->20->27->
//
饭凉凉 2014-09-12
  • 打赏
  • 举报
回复
引用 2 楼 caiwei_cs 的回复:
[quote=引用 1 楼 modyaj 的回复:] 有申请就要释放!
如果在子函数里面,是不是会像局部变量一样,在函数结束后自动释放呢? 因为这些空间里面的东西我也不需要了,被系统自动收回也无所谓。[/quote] 也需要释放的。
lin5161678 2014-09-12
  • 打赏
  • 举报
回复
有malloc 就得 free 不用思考
caiwei_cs 2014-09-12
  • 打赏
  • 举报
回复
引用 1 楼 modyaj 的回复:
有申请就要释放!
如果在子函数里面,是不是会像局部变量一样,在函数结束后自动释放呢? 因为这些空间里面的东西我也不需要了,被系统自动收回也无所谓。
modyaj 2014-09-12
  • 打赏
  • 举报
回复 1
有申请就要释放!

70,005

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧