11

我在最近的一次采访中被问到这个问题,基本上是编写一个函数来结合 free 和分配 null 的功能。我是这样回答的:

void main()
{
      int *ptr;
      ptr = new int;
      ptr = newdelete(ptr);
}

(int*) newdelete (int *ptr)
{
      delete(ptr);
      return NULL;
}

因此,在执行之后,ptr本地 tomain将在我从newdelete函数返回它时保存 null 值。如果我刚刚分配NULL了 newdelete 函数,则ptr本地 tonewdelete将被清空,而不是ptr本地 to main

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

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

4

4 回答 4

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;
}
于 2010-07-02T07:08:28.247 回答
8

我猜他期待的是这样的:

void reset(int*& ptr)
{
      delete(ptr);
      ptr = NULL;
}

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

于 2010-07-02T07:10:52.857 回答
1

你不

您使用类似 的智能指针auto_ptrshared_ptr它本身为空。

于 2010-07-02T10:03:57.603 回答
1

如果要求不是编写一个函数,你总是可以编写一个宏来为你做这件事:

#define my_delete(x) { delete x; x = NULL; }

当然,这样称呼它会给你带来各种各样的麻烦:

my_delete(ptr++)

所以,我想我更喜欢非宏观的方式。

于 2010-07-02T07:39:38.140 回答