如何释放将被退回的char *?

时间:2014-03-28 03:03:05

标签: c malloc free

说我有以下功能:

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;
}

温度会导致内存泄漏吗? 如果是这样,是否有可能在我们返回临时之前释放它?

谢谢!

3 个答案:

答案 0 :(得分:3)

不,你只能在不再需要引用时释放已分配的内存,这意味着调用者需要释放返回的值(你应该在函数文档中提到这一点)。

顺便说一句,如果你的输入字符串中没有空格,你将在temp[count] = '\0';上得到一个越界数组引用,所以你应该再分配一个字节。 (并且trim通常不会移除内部空格,但也许这就是您调用fakeTrim的原因。)

答案 1 :(得分:1)

不,当然,您无法释放属于您返回的数据的内存。事实上,在像这样的实用程序函数中分配内存极有可能导致内存泄漏;由于呼叫者不会看到功能体,因此她很容易忘记释放它。实际上有这个问题的标准解决方案,那就是让调用者自己分配内存:

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);

答案 2 :(得分:0)

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

但是,我有一个替代解决方案,以满足您的要求。 您可以通过使用传递引用来使用调用函数中的动态变量,然后将其从调用函数本身释放(无需将其从被调用函数中释放)。请参阅以下内容:

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中提供的示例代码来查看是否存在任何内存泄漏。

希望它有所帮助。