Запись функции для освобождения указателя и присвоения его ПУСТОЙ УКАЗАТЕЛЬ

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

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

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

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

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

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

11
задан Palec 3 August 2017 в 10:43
поделиться

4 ответа

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

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

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

my_delete(ptr++)

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

1
ответ дан 3 December 2019 в 01:06
поделиться

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

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

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

8
ответ дан 3 December 2019 в 01:06
поделиться

Вы не

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

1
ответ дан 3 December 2019 в 01:06
поделиться

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

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;
}
36
ответ дан 3 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: