免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 无花有果
打印 上一主题 下一主题

[C] 这样动态分配的内存应该怎么释放? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-03-17 23:13 |只看该作者
char ** getMem(void)
{
        char **p;

        p = malloc(4*sizeof(char *));

        p[0] = malloc(10);
        strcpy(p[0], "kjdjfkd");
        p[1] = malloc(1000);
        strcpy(p[1], "jjjjjjjjjjjjjjjjj");

        return p;
}

假如调用这个函数的声明如下:
char **pMem;

pMem = getMem();
那么应该如何释放这些动态申请的内存?

这个函数设计有问题,该函数中使用到的指针变量“char **p”是一个局部变量,无法通过return语句返回给调有getMem()的函数,因为getMem()中的局部变量在该函数退出时,就会自动释放,那么返回的将是一个不可知的地址。

论坛徽章:
0
12 [报告]
发表于 2011-03-18 00:21 |只看该作者
这个调用貌似内存泄露了,设计有问题,外部不可能对一个局部变量进行显示的free

论坛徽章:
0
13 [报告]
发表于 2011-03-22 18:34 |只看该作者
char ** getMem(void)
{
        char **p;

        p = malloc(4*sizeof(char *));

        p[0]  ...
lixiaxin200319 发表于 2011-03-17 23:13


谢谢lixiaxin200319的回答,不过个人理解有点不同。作为一个变量,返回的时候,值是在返回值里面的。这里是动态分配,不会在函数结束的时候释放掉已经分配的,所要的,就是一个分配的地址值而已。

论坛徽章:
0
14 [报告]
发表于 2011-03-22 18:36 |只看该作者
这个调用貌似内存泄露了,设计有问题,外部不可能对一个局部变量进行显示的free
dujixian 发表于 2011-03-18 00:21



    相当于一个指针数组,其实可以让p[2](形象的说法)=NULL。然后在主调用函数里面对指针进行偏移释放,直到遇到NULL。不过像大多数人的说法,确实只能一个个释放。

论坛徽章:
0
15 [报告]
发表于 2011-03-22 18:38 |只看该作者
回复 10# zuobiandashu


    不会报错,c会自动转换类型(对于void)

论坛徽章:
0
16 [报告]
发表于 2011-03-23 22:50 |只看该作者
--------------------------------------------------------------------------------




QUOTE:char ** getMem(void)
{
        char **p;

        p = malloc(4*sizeof(char *));

        p[0]  ...
lixiaxin200319 发表于 2011-03-17 23:13


谢谢lixiaxin200319的回答,不过个人理解有点不同。作为一个变量,返回的时候,值是在返回值里面的。这里是动态分配,不会在函数结束的时候释放掉已经分配的,所要的,就是一个分配的地址值而已。


呵呵
我写了代码测试,你是对的。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **getMem()
{
   char **p;
   p = (char **)malloc(4*sizeof(char *));
   
   p[0] = (char *)malloc(100);
   strcpy(p[0],"ni hao");
   p[1] = (char *)malloc(100);
   strcpy(p[1],"hell");

   return p;
}

int main()
{
   char **pMem;
   pMem = getMem();
   printf("pMem[0] = %s\n",pMem[0]);
   printf("pMem[1] =%s\n",pMem[1]);

   free(pMem);
   free(pMem[1]);
   //free(pMem[0]);
}

    该程序用malloc()动态分配的内存空间只能用free(pMem[0])、free(pMem[1]),这样的方式一个个的释放,用free(pMem)其实就是与free(pMem[0])执行一样的操作。
   如果把 //free(pMem[0])的注释去除,在程序执行时就会因为重复释放pMem[0]而报错。

论坛徽章:
0
17 [报告]
发表于 2011-03-27 18:21 |只看该作者
--------------------------------------------------------------------------------




QUOTE:char ...
lixiaxin200319 发表于 2011-03-23 22:50



    pMem应该放在最后释放,用Valgrind测试一下你的代码看看,是不是有内存泄露了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP