Написание функции, чтобы освободить указатель и присвоить ему NULL

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

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

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

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

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

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

Ответ 1

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

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;
}

Ответ 2

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

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

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

Ответ 3

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

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

Конечно, называть его таким образом, вы столкнетесь со всеми неприятностями:

my_delete(ptr++)

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

Ответ 4

Вы не

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