繁体   English   中英

如何释放将返回的char *?

[英]How to free a char* that will be returned?

说我有以下功能:

char* fakeTrim(char* input) {
    char* temp = malloc(strlen(input));
    int count = 0;
    for(int i = 0; i < strlen(input); i++) {
        if(input[i] != ' ')
            temp[count++] = input[i];
    }
    temp[count] = '\0';
    return temp;
}

温度会引起内存泄漏吗? 如果是这样,是否有可能在我们返回温度之前将其释放?

谢谢!

不可以,只有在不再需要引用已分配的内存时才可以释放它,这意味着调用者需要释放返回的值(并且您应该在函数的文档中提及这一点)。

顺便说一句,您将在temp[count] = '\\0';获得一个超出范围的数组引用temp[count] = '\\0'; 如果输入字符串中没有空格,则应再分配一个字节。 (并且trim通常不会删除内部空间,但这也许就是为什么您将其称为fakeTrim 。)

不,您当然不能释放属于您要返回的数据的内存。 确实,在这样的实用程序函数中分配内存会使内存泄漏的可能性极高。 由于调用者看不到功能主体,因此忘记释放该功能主体将非常容易。 实际上,有一个解决此问题的标准方法,那就是让调用者自己分配内存:

void fakeTrim(const char* input, char* temp) {
    int count = 0;
    for(int i = 0; i < strlen(input); i++) {
        if(input[i] != ' ')
            temp[count++] = input[i];
    }
    temp[count] = '\0';
}

现在内存泄漏仍然有可能,但这不是“您的错”-调用者应该知道释放他分配的内存。 注意,在签名中添加const可以使输入哪个参数和输出哪个参数变得清晰。

编辑:这是一个用例:

const char* input = "Hello world";
char* temp = malloc(strlen(input)+1);
fakeTrim(input, temp);
// ... do something with temp
free(temp);

是的,确实温度会导致内存泄漏。

但是,对于您的要求,我有另一种解决方案。 您可以在调用方函数中使用动态变量,方法是使用按引用传递,然后将其从调用方函数本身释放(无需从调用的函数中释放动态变量)。 请看下面:

void main()
{
        char *test;

        setVal(test);
        puts(test);
        if(test){
                free(test);
                test = NULL;
        }
}
void setVal(char **data)
{
        char retry[100]="This is test";
        char *ret;

        ret = malloc((strlen(retry))*sizeof(char));
        if(ret == NULL)
                exit(1);
        strncpy(ret, retry, strlen(retry));

        *data = ret;
}

如果您仍然不满意。 使用我与VALGRIND一起提供的示例代码来查看是否存在内存泄漏。

希望能帮助到你。

暂无
暂无

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

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