免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5091 | 回复: 16
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-16 20:07 |只看该作者 |倒序浏览
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();
那么应该如何释放这些动态申请的内存?

论坛徽章:
0
2 [报告]
发表于 2011-03-16 20:11 |只看该作者
free(p[0])
free(p[1])

free(p)

论坛徽章:
0
3 [报告]
发表于 2011-03-16 20:16 |只看该作者
今天看到一段前人写的代码,直接free(*pMem),或者free(pMem),两个版本。

让我觉得很疑惑,以为可以像c++那样delete [] p就可以了

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2011-03-16 20:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2011-03-16 20:47 |只看该作者
这个只是我给的值,实际上的是一个宏定义,然后偏移

论坛徽章:
0
6 [报告]
发表于 2011-03-16 22:25 |只看该作者
回复 4# pmerofc


    static char **fill_envp(struct dhcpMessage *packet)
{
        int num_options = 0;
        int i, j;
        unsigned char *addr;
        char **envp, *temp;
        char over = 0;

        if (packet == NULL)
                num_options = 0;
        else {
                for (i = 0; options.code; i++)
                        if (get_option(packet, options.code))
                                num_options++;
                if (packet->siaddr) num_options++;
                if ((temp = (char *)get_option(packet, DHCP_OPTION_OVER)))
                        over = *temp;
                if (!(over & FILE_FIELD) && packet->file[0]) num_options++;
                if (!(over & SNAME_FIELD) && packet->sname[0]) num_options++;               
        }
       
        envp = malloc((num_options + 5) * sizeof(char *));
        envp[0] = malloc(strlen("interface=") + strlen(client_config.interface) + 1);
        sprintf(envp[0], "interface=%s", client_config.interface);
        envp[1] = malloc(sizeof("ip=255.255.255.255"));
        envp[2] = find_env("PATH", "PATH=/bin:/usr/bin:/sbin:/usr/sbin");
        envp[3] = find_env("HOME", "HOME=/");

        if (packet == NULL) {
                envp[4] = NULL;
                return envp;
        }

        addr = (unsigned char *) &packet->yiaddr;
        sprintf(envp[1], "ip=%d.%d.%d.%d",
                addr[0], addr[1], addr[2], addr[3]);
        // brcm
        sprintf(local_ip, "%d.%d.%d.%d",
                addr[0], addr[1], addr[2], addr[3]);
        strcpy(dns_ip, "");

        for (i = 0, j = 4; options.code; i++) {
                if ((temp = (char *)get_option(packet, options.code))) {
                        envp[j] = malloc(max_option_length(temp, &options) +
                                        strlen(options.name) + 2);
                        fill_options(envp[j], (unsigned char *)temp, &options);
                        j++;
                }
        }
        if (packet->siaddr) {
                envp[j] = malloc(sizeof("siaddr=255.255.255.255"));
                addr = (unsigned char *) &packet->yiaddr;
                sprintf(envp[j++], "siaddr=%d.%d.%d.%d",
                        addr[0], addr[1], addr[2], addr[3]);
        }
        if (!(over & FILE_FIELD) && packet->file[0]) {
                /* watch out for invalid packets */
                packet->file[sizeof(packet->file) - 1] = '\0';
                envp[j] = malloc(sizeof("boot_file=") + strlen((char *)(packet->file)));
                sprintf(envp[j++], "boot_file=%s", packet->file);
        }
        if (!(over & SNAME_FIELD) && packet->sname[0]) {
                /* watch out for invalid packets */
                packet->sname[sizeof(packet->sname) - 1] = '\0';
                envp[j] = malloc(sizeof("sname=") + strlen((char *)(packet->sname)));
                sprintf(envp[j++], "sname=%s", packet->sname);
        }       
        envp[j] = NULL;

   sendEventMessage(TRUE, local_ip, subnet_ip, router_ip, dns_ip, ipv4MaskLen, ipv6PrefixLen, brAddr, ipv6rdPrefix);

        return envp;
}


/* Call a script with a par file and env vars */
void run_script(struct dhcpMessage *packet, const char *name)
{
        char **envp;

   if (!strcmp(name, "bound"))
   {
      envp = fill_envp(packet);
      free(*envp);
   }

}


略过一些代码,大致如上了。

论坛徽章:
0
7 [报告]
发表于 2011-03-17 11:00 |只看该作者
只能一个一个释放了 ...

论坛徽章:
0
8 [报告]
发表于 2011-03-17 13:17 |只看该作者
多少个malloc就多少个free

或者你可以实现链式的分配,这样释放时只需要针对头释放一次即可

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
9 [报告]
发表于 2011-03-17 14:54 |只看该作者
one by one

论坛徽章:
0
10 [报告]
发表于 2011-03-17 23:07 |只看该作者
p = malloc(4*sizeof(char *));这句应该会报错吧? malloc返回无符号类型的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP