繁体   English   中英

如何释放 memory 并同时返回指针?

[英]How can I free memory and at the same time return a pointer?

我有这些功能

char *hash(char *stringa, char *tipohash) {
    if (strcmp(tipohash, "md5") == 0) {
        stringa = md5(stringa);
    }
    return stringa;
}

char *md5(char *stringa) {
    unsigned char risultato[MD5_DIGEST_LENGTH];
    int i;
    char *hashfinale = malloc(sizeof(char) * MD5_DIGEST_LENGTH * 2);
    MD5((const unsigned char *)stringa, strlen(stringa), risultato);
    for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
        sprintf(hashfinale + 2 * i, "%02x", risultato[i]);
    }
    return (char *)hashfinale;
}

如何在不丢失字符串值的情况下免费返回(char *)hashfinale

这是来电者

char *hashlinea = hash(stringa, hashType);

基本上有两种方法可以解决这个问题,它们都不涉及你的代码调用free


第一种方法是从现在开始什么都不做,除了添加文档,以便hash function 的用户知道代码必须在返回的指针上调用free

// This is the code using your function
char *hashlinea = hash(stringa,hashType);

// Some code using hashlinea

free(hashlinea);

第二种方法是将指针传递给现有数组,您的代码使用该数组而不是使用malloc分配它:

char hashlinea[MD5_DIGEST_LENGTH*2];
hash(stringa, hashType, hashlinea);

For this your hash function needs to pass on the third argument to the md5 function, which should use it instead of allocating memory:

char *md5(char *stringa, char *hashfinale){
    unsigned char risultato[MD5_DIGEST_LENGTH];
    int i;
    // No memory allocation here
    MD5((const unsigned char *)stringa, strlen(stringa), risultato);
    for(i = 0; i < MD5_DIGEST_LENGTH; i++) {
        sprintf(hashfinale + 2*i,"%02x",risultato[i]);
    }
    return hashfinale;
}

这不可能。 IMO 最好将指针传递给缓冲区。 调用方将负责 memory 管理

char *md5(char *stringa, char *hashfinale){
 ...
}

您的md5 function 存在问题:为 MD5 hash 分配的大小必须比 null 终止符长一个字节:

char *hashfinale = malloc(sizeof(char) * (MD5_DIGEST_LENGTH * 2 + 1));

请注意,在 C(和 C++)中sizeof(char)根据定义为1 ,因此您可以只写:

char *hashfinale = malloc(MD5_DIGEST_LENGTH * 2 + 1);

关于您的问题, hash返回其参数或分配的 object。 这是 memory 管理的问题,因为您可能稍后在程序中不知道是否必须释放返回值。 传递 hash 字符串的目标数组是更好的选择,否则您应该复制该字符串,以便可以无条件释放hash的返回值:

char *md5(const char *stringa) {
    unsigned char risultato[MD5_DIGEST_LENGTH];
    int i;
    char *hashfinale = malloc(MD5_DIGEST_LENGTH * 2 + 1);
    MD5((const unsigned char *)stringa, strlen(stringa), risultato);
    for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
        sprintf(hashfinale + 2 * i, "%02x", risultato[i]);
    }
    return hashfinale;
}

// always free the return value
char *hash(const char *stringa, const char *tipohash) {
    if (!strcmp(tipohash, "md5")) {
        return md5(stringa);
    } else {
        return strdup(stringa);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM