• 1524阅读
  • 12回复

[提问]这个变量在哪里free()呢? [复制链接]

上一主题 下一主题
离线mugua001
 

只看楼主 倒序阅读 楼主  发表于: 2021-08-04
请问:unsigned char *data = (unsigned char *)malloc(*len);
这个在哪里 free(data)呢?

//---------------代码如下-----------------
static unsigned char* unpack_padding_pkcs5(const unsigned char in[], int *len){
    unsigned char paddNum = in[*len - 1];
    if(paddNum > 8){
        *len = 0;
        return NULL;
    }
    *len = *len - paddNum;

    unsigned char *data = (unsigned char *)malloc(*len);
    memset(data, 0, *len);
    memcpy(data, in, *len );
    return data;
}
离线kaon

只看该作者 1楼 发表于: 2021-08-04
不在这个函数中free
离线九重水

只看该作者 2楼 发表于: 2021-08-04
楼主需要补充一下C的知识,在这里free的话,返回的data就可能错误了,因为你提前释放了内存。
离线青空飞羽

只看该作者 3楼 发表于: 2021-08-04
不再使用的时候free
离线mugua001

只看该作者 4楼 发表于: 2021-08-04
回 九重水 的帖子
九重水:楼主需要补充一下C的知识,在这里free的话,返回的data就可能错误了,因为你提前释放了内存。[表情]  (2021-08-04 09:06) 

是的,不能在这个函数里free;

可是在它调用返回之后,再free时,针对哪个 针对进行free呢?这就是我没看明白的地方
离线mugua001

只看该作者 5楼 发表于: 2021-08-04
回 九重水 的帖子
九重水:楼主需要补充一下C的知识,在这里free的话,返回的data就可能错误了,因为你提前释放了内存。[表情]  (2021-08-04 09:06) 

是的,不能在这个函数里free;

可是在它调用返回之后,再free时,针对哪个 对象 进行free呢?这就是我没看明白的地方
离线mugua001

只看该作者 6楼 发表于: 2021-08-04
回 青空飞羽 的帖子
青空飞羽:不再使用的时候free (2021-08-04 10:21) 

没错,是在这函数返回值使用完之后free;
问题来了,我free时,针对 哪个对象呢?  
离线mugua001

只看该作者 7楼 发表于: 2021-08-04
回 青空飞羽 的帖子
青空飞羽:不再使用的时候free (2021-08-04 10:21) 

是这样吗?

char *n1 = unpack_padding_pkcs5(...);

free(n1);

是这样?
离线青空飞羽

只看该作者 8楼 发表于: 2021-08-04
回 mugua001 的帖子
mugua001:是这样吗?
char *n1 = unpack_padding_pkcs5(...);
....... (2021-08-04 13:47) 

是的
离线mugua001

只看该作者 9楼 发表于: 2021-08-04
回 青空飞羽 的帖子
青空飞羽:是的 (2021-08-04 15:47) 

谢谢。
离线mugua001

只看该作者 10楼 发表于: 2021-08-04
回 青空飞羽 的帖子
青空飞羽:是的 (2021-08-04 15:47) 

我之前的程序,都没有free,是不是会内存溢出呀
离线clickto

只看该作者 11楼 发表于: 2021-08-04
回 mugua001 的帖子
mugua001:我之前的程序,都没有free,是不是会内存溢出呀 (2021-08-04 20:27) 

会的。
现在的操作系统理论上在进程结束的时候会回收该进程的内存。
不过,只申请不释放,这不是个好习惯。
离线mugua001

只看该作者 12楼 发表于: 2021-08-06
回 clickto 的帖子
clickto:会的。
现在的操作系统理论上在进程结束的时候会回收该进程的内存。
不过,只申请不释放,这不是个好习惯。 (2021-08-04 22:41) 

嗯,程序内部、指针传参的方式malloc()申请的内存,我都free过。

像这个函数这样 非传参方式的,我没有 free 。

感谢感谢。
快速回复
限100 字节
 
上一个 下一个