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

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

假设 func2() 仅在条件中需要。由于我需要释放新分配的内存,我怎样才能在同一行中释放它(即具有相同的条件或括号)?我这样做的动机是保持代码干净。

编辑 1. 是的,这是交流问题。对我来说,使用“字符串”类型是错误的,因为我总是将它类型定义为 char*。对困惑感到抱歉。

4

3 回答 3

8

要干净利落地执行此操作,请创建一个以清晰方式完成工作的新函数:

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

…
if (func3() == 4)
    …

(想必有一定的保证func2成功分配内存。如果没有,你必须测试它的返回值。)

于 2013-09-18T13:35:42.640 回答
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 */
}
于 2013-09-18T13:48:55.783 回答
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
}

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

于 2013-09-18T14:21:12.217 回答