c - 在一个条件下混合赋值和free()?

时间:2013-09-18 13:30:42

标签: c

typedef char* string;
int func1(string s);
char* func2(); // returns a new memory/

if(func1(func2()) == 4)
{
// code
}

假设只在条件中需要func2()。由于我需要释放新分配的内存,我如何在相同的行内释放它(即具有相同的条件或paranthesis)?我的动机是保持代码清洁。

编辑1。 是的,这是一个问题。使用“string”类型对我来说是错误的,因为我总是将它键入到char *中。对不起,感到困惑。

3 个答案:

答案 0 :(得分:8)

要干净利落地完成这项工作,请创建一个能够以清晰的方式完成工作的新功能:

static int func3()
{
   char *s = func2();
   int result = func1(s);
   free(s);
   return result;
}

…
if (func3() == 4)
    …

(据推测,可以确保func2成功分配内存。如果没有,则必须测试其返回值。)

答案 1 :(得分:1)

将它释放到同一行,没有新的函数定义:

int result;
char *temp;
/* comma operator: evaluate these 4 expressions left-to-right,
   and the value is the value of the last expression */
if(temp = func2(), result = (func1(temp) == 4), free(temp), result)
{
    /* Do things */
}

清洁代码:

int func3(void)
{
    char *temp;
    int result;
    temp = func2();
    result = func1(temp);
    free(temp);
    return result;
}

/* ... */

if(func3() == 4)
{
    /* do things */
}

答案 2 :(得分:1)

以下是使用功能方法的解决方案:

int apply_free(int (*f1)(char*), char * (*f2)()) {
    char *s = f2();
    if (s != NULL) {
        int result = f1(s);
        free(s);
        return result;
    }
    else {
        return -1; /* or any meaningful value if f2 returned a NULL pointer */
    }
}

if (apply_free(func1, func2) == 4)
{
    // code
}

这假设您的各种案例具有相同的类型签名。