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

Har*_*gar 11 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;
}
Run Code Online (Sandbox Code Playgroud)

因此在执行之后,当我从函数返回时,ptr本地main将保持空值newdelete.如果我刚刚NULL在newdelete函数中分配,则ptr本地newdelete将被取消,而不是ptr本地的main.

我认为我的解决方案是正确的,面试官也接受了.但是,他期待着其他一些答案.他坚持要求我不NULL从函数返回并仍然达到预期的效果.

有没有办法实现这一目标?我能想到的只是传递另一个参数,它是指向ptr本地指针的指针main,但我不明白为什么它比我做的更好!

Sig*_*erm 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,您需要第二个版本的数组. (6认同)
  • 由于只有代码,因此这是一个更好的解决方案的原因是您保证在调用期间指针将被清零.使用问题中的代码,您可以跳过(忘记)返回值:`/*p =*/newdelete(p);`并且内存将被释放但指针将为非null. (4认同)
  • 问题当然是:这有什么安全吗?你隐藏错误而不是检查它们...... (2认同)

ere*_*eOn 8

我猜他期待的是:

void reset(int*& ptr)
{
      delete(ptr);
      ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)

一个更清洁的解决方案就是使用a boost::shared_ptr<>并简单地调用ptr.reset().但是,我想这不是一个选择.