LINUX.ORG.RU

История изменений

Исправление 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;
}