编写一个函数来释放指针并将其赋值为NULL

时间:2010-07-02 07:06:16

标签: c++ delete-operator dangling-pointer

我在最近的一次采访中被问到这个问题,基本上是编写了一个函数来结合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}}的指针,但我不明白为什么它比我做的更好!

4 个答案:

答案 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_ptrshared_ptr,它自动为空。