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