2013-09-18 3 views
1
typedef char* string; 
int func1(string s); 
char* func2(); // returns a new memory/ 

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

Предполагая, что func2() требуется только в состоянии. Так как мне нужно освободить вновь выделенную память, как я могу освободить ее в пределах одной строки (т. Е. С тем же условием или paranthesis)? Мой мотив для этого - сохранить код чистым.c - назначение смешивания и свободный() в состоянии?

EDIT 1. Да, это вопрос c. Использование типа «string» было ошибкой с моей стороны, поскольку я всегда набирал его на char *. Извините за путаницу.

+10

Не делайте этого. Не ставьте сложную задачу в условие if. Это ущемляет ясность, удобочитаемость и ремонтопригодность. –

+2

это ни в коем случае не «чистый». Эмпирическое правило состоит в том, что когда функция выделяет память и возвращает указатель, вызывающий контекст должен отвечать за освобождение, что означает сохранение указателя как переменной. И является ли тип 'string' символом * typedef? – SirDarius

+0

Вызов функции, которая выделяет такую ​​память, никогда не бывает чистой. Если вы используете C++ (как предполагает использование 'string'), сделайте что-то вроде' char * temp = func2(); std :: string temp2 (temp); free (temp); 'и используйте' temp2' в 'if'. – filmor

ответ

1

Free это в той же строке, без каких-либо новых определений функций:.

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 */ 
} 
+0

Я выводя в if (stmnt, .., int_var), только результат будет определяться только int_var. Это также верно для int conditon_status = (stmnt, .., int_var); , Пожалуйста, подтвердите оба. – AirTycoon

+0

@ato Правильно. Оператор запятой позволяет создавать выражения, в которых все выражения, разделенные запятыми, оцениваются, а значение общего выражения - это значение последнего разделенного запятыми выражения. –

8

Чтобы сделать это аккуратно, сделать новую функцию, которая делает работу в ясной манере:.

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

… 
if (func3() == 4) 
    … 

(По-видимому, есть некоторые гарантии того, что func2 успешно выделяет память Если нет, то вы должны проверить его возвращение значение)

+0

Если бы таких примеров было мало, я бы использовал этот подход. – AirTycoon

+0

Я бы подумал, что если бы таких примеров было много, вы бы хотели использовать этот подход. Чтобы инкапсулировать проблему в одну функцию. –

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 
} 

это предполагает, что различные случаи будут иметь один и тот же тип подписи.

Смежные вопросы