2014-09-04 3 views
1

Оба метода работают, но какой из них быстрее или эффективнее в случае ptr == NULL?Выполнение методов бесплатно (указатель)?

void voo() 
{  
    str *ptr = NULL;  

    // try to malloc memory and do something 

    // leaving methode and free the memory 
    if(ptr != NULL) 
    { 
    free(ptr); 
    ptr = NULL; 
    } 
} 

Мне нужен if запрос вообще, если я оставлю метод делать? Не так ли быстро дать free памяти в любом случае?

void baa() 
{  
    str *ptr = NULL;  

    // try to malloc memory and do something 

    // leaving methode and free the memory 
    free(ptr); 
    ptr = NULL; 
} 
+0

'free (ptr)' вы имеете в виду, правильно? –

+8

Почему вы помечаете C++? Обычно вы не используете 'malloc' /' free' в C++, и в большинстве случаев, как вы, вы бы не использовали динамическое размещение. – crashmstr

+2

Окончательный 'ptr = NULL' также бессмыслен (хотя компилятор должен понимать это, а не генерировать какой-либо код времени для его использования). –

ответ

9

От стандарта C, 7.20.3.2/2, если ptr является NULL то free(ptr) ничего не делает.

Поэтому вам бессмысленно проверять это, как с точки зрения производительности, так и с избыточным кодом.

+4

+1. Установка 'ptr' в' NULL' прямо перед тем, как он выходит из сферы действия, также бессмысленна, шумна и запутанна. – unwind

+2

Просто, чтобы сделать его явным: в общем, установка указателя на NULL после free'ing прекрасна. Это бессмысленно здесь только из-за ограниченного объема 'ptr'. – oxygene

+0

@oxygene Установка освобожденного указателя на нуль обычно бессмысленна, так как большую часть времени он сразу выходит из области видимости. (В C++ я бы предположил, что большинство применений 'delete' находятся в деструкторах, и в этом случае нет смысла устанавливать указатель на null.) Поиск всех других указателей на объект и установка их в null может быть полезным. Если вы можете найти эффективный способ сделать это. –

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