История изменений
Исправление Vic, (текущая версия) :
Я вот такую технику применяю. И никаких goto нет и освободить переменную не забудешь. FreeAndNULL() можно и по ходу обработки вызывать, если уж очень хочется, а не только в конце.
void FreeAndNULL(void **Ptr);
int function(const char *param)
{
int retval = 1;
char *var1 = fcn_that_returns_dynamically_allocated_string(param);
if (var1 != NULL) // Эта проверка, кстати, уже лишняя.
{
if (isValid(var1))
retval = some_function(var1);
else
if (isGood(var1))
retval = 0;
}
else
retval = 0;
FreeAndNULL((void**)&var1);
return retval;
}
void FreeAndNULL(void **Ptr)
{
if (Ptr == NULL)
return;
if ((*Ptr) != NULL)
free(*Ptr);
(*Ptr) = NULL;
}
Исправление Vic, :
Я вот такую технику применяю. И никаких goto нет и освободить переменную не забудешь. FreeAndNULL() можно и по ходу обработки вызывать, если уж очень хочется, а не только в конце.
void FreeAndNULL(void **Ptr);
int function(const char *param)
{
int retval = 1;
char *var1 = fcn_that_returns_dynamically_allocated_string(param);
if (var1 != NULL)
{
if (isValid(var1))
retval = some_function(var1);
else
if (isGood(var1))
retval = 0;
}
else
retval = 0;
FreeAndNULL((void**)&var1);
return retval;
}
void FreeAndNULL(void **Ptr)
{
if (Ptr == NULL)
return;
if ((*Ptr) != NULL)
free(*Ptr);
(*Ptr) = NULL;
}
Исходная версия Vic, :
Я вот такую технику применяю. И никаких goto нет и освободить переменную не забудешь. FreeAndNULL() можно и по ходу обработки вызывать, если уж очень хочется.
void FreeAndNULL(void **Ptr);
int function(const char *param)
{
int retval = 1;
char *var1 = fcn_that_returns_dynamically_allocated_string(param);
if (var1 != NULL)
{
if (isValid(var1))
retval = some_function(var1);
else
if (isGood(var1))
retval = 0;
}
else
retval = 0;
FreeAndNULL((void**)&var1);
return retval;
}
void FreeAndNULL(void **Ptr)
{
if (Ptr == NULL)
return;
if ((*Ptr) != NULL)
free(*Ptr);
(*Ptr) = NULL;
}