Меня спросили это в недавнем интервью, в основном пишущий функцию для объединения функциональности свободного и присваивающегося пустого указателя. Я ответил следующим образом:
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
, но я не вижу, почему лучше, чем, что я сделал!
Если бы требовалось не написать функцию, вы всегда могли бы написать макрос, который сделал бы это и за вас:
#define my_delete(x) { delete x; x = NULL; }
Конечно, такой его вызов поможет вам во всевозможные проблемы:
my_delete(ptr++)
Итак, я думаю, что предпочитаю немакро-путь.
Я думаю, он ожидал чего-то вроде:
void reset(int*& ptr)
{
delete(ptr);
ptr = NULL;
}
An еще более чистым решением было бы использовать boost :: shared_ptr <>
и просто вызвать ptr.reset ()
. Однако я полагаю, это был не вариант.
Вы не
Вы используете умный указатель, например auto_ptr
, shared_ptr
, который обнуляется.
Есть ли способ сделать это ??
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;
}