我在最近的一次采访中被问到这个问题,基本上是编写了一个函数来结合free的功能和赋值null。我用以下方式回答:
void main()
{
int *ptr;
ptr = new int;
ptr = newdelete(ptr);
}
(int*) newdelete (int *ptr)
{
delete(ptr);
return NULL;
}
因此,执行后,ptr
本地main
将保留空值,因为我从newdelete
函数返回它。如果我刚刚在newdelete函数中指定了NULL
,那么ptr
本地newdelete
将被取消,而ptr
本地main
将被取消NULL
。
我认为我的解决方案是正确的,面试官也接受了。但是,他期待着其他一些答案。他坚持要求我不从功能中返回ptr
并仍然达到预期的效果。
有没有办法实现这一目标?我能想到的只是传递另一个参数,它指向main
本地指针{{1}}的指针,但我不明白为什么它比我做的更好!
答案 0 :(得分:36)
有没有办法实现这个?
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;
}
答案 1 :(得分:8)
我猜他期待的是:
void reset(int*& ptr)
{
delete(ptr);
ptr = NULL;
}
更清晰的解决方案是使用boost::shared_ptr<>
并简单地拨打ptr.reset()
。但是,我想这不是一个选择。
答案 2 :(得分:1)
如果要求不是写一个函数,你总是可以编写一个宏来为你做这个:
#define my_delete(x) { delete x; x = NULL; }
当然,这样称呼它会让你遇到各种各样的麻烦:
my_delete(ptr++)
所以,我认为我更喜欢非宏观方式。
答案 3 :(得分:1)
你没有
您使用智能指针,如auto_ptr
,shared_ptr
,它自动为空。