Написание функции для освобождения указателя и присвоение ему NULL - PullRequest
11 голосов
/ 02 июля 2010

Меня спросили об этом в недавнем интервью, в основном я писал функцию, сочетающую функциональность free и присваивающую null.Я ответил следующим образом:

void main()
{
      int *ptr;
      ptr = new int;
      ptr = newdelete(ptr);
}

(int*) newdelete (int *ptr)
{
      delete(ptr);
      return NULL;
}

Так что после выполнения локальный main ptr будет содержать нулевое значение, так как я возвращаю его из функции newdelete.Если бы я только что присвоил NULL в функции newdelete, локальный ptr для newdelete будет обнуляться, а не локальный ptr для main.

Я думаю, что мое решение было правильным, интервьюер тоже принял его.Однако он ожидал другого ответа.Он настаивал на том, чтобы я не возвращал NULL из функции и все еще достигал желаемого результата.

Есть ли способ сделать это?Все, что я могу придумать, это передать другой аргумент, который является указателем на локальный указатель ptr на main, но я не понимаю, почему это лучше, чем то, что я сделал!

Ответы [ 4 ]

36 голосов
/ 02 июля 2010

Есть ли способ сделать это ??

template <typename T> void safeDelete(T*& p){
    delete p;
    p = 0;
}

int main(int argc, char** arv){
    int * i = new int;
    safeDelete(i);
    return 0;
}
8 голосов
/ 02 июля 2010

Я думаю, он ожидал чего-то вроде:

void reset(int*& ptr)
{
      delete(ptr);
      ptr = NULL;
}

Еще более чистым решением было бы использовать boost::shared_ptr<> и просто позвонить ptr.reset(). Тем не менее, я полагаю, что это не вариант.

1 голос
/ 02 июля 2010

Вы не

. Вы используете умный указатель, такой как auto_ptr, shared_ptr, который обнуляется.

1 голос
/ 02 июля 2010

Если в запросе не было написания функции, вы всегда можете написать макрос, который сделает это и для вас:

#define my_delete(x) { delete x; x = NULL; }

Конечно, если вы будете называть это так, вы попадете во все виды неприятностей:

my_delete(ptr++)

Итак, я думаю, что предпочитаю немакро-способ.

...