2011-03-24 55 views
1

在C++中,我们使用delete运算符来大部分时间删除对象。删除后将C++指针初始化为零?

delete不使指针值为NULL。有什么办法可以自动实现?

例如

int *p = new int; 
delete p; // this should deallocate object pointed by p 
      // and also initialized value of p = NULL 
+0

你为什么认为这是一个好主意?搜索其他问题和/或谷歌它,你会看到,它不是很清楚,这不会实际上隐藏代码中的错误(双删除,其中第二个删除*被忽略*因为指针先前设置为0) – 2011-03-24 08:34:21

回答

0

它是简单写一个这样的:

template<class T> 
void safe_delete(T*& p) 
{ 
    delete p; 
    p = NULL; 
} 
int main() 
{ 
    int* p = new int; 
    safe_delete(p); 

    double* p1 = new double; 
    safe_delete(p1); 

} 

要小心,不要使用数组使用这个虽然:)

4

你可以编写自己的包装函数或宏来做到这一点。 但是,在一般情况下很难,因为您可以将rvalue传递给删除操作符。那么它应该给NULL分配什么?

+0

对不起,但我无法理解你的陈述*你可以将右值传递给删除操作符*,你能详细说明一下吗?你怎么能通过一个右值来删除? – liaK 2011-03-24 07:12:16

+3

'delete(new int(42));' – 2011-03-24 07:17:43

+0

实际上,右值问题可以通过使用右值引用在C++ 0x中解决......使用右值,您肯定不需要无效。 – 2011-03-24 07:33:22

0

你可以编写自己的函数来做到这一点:

void deleteAndReset (void** p) 
{ 
    delete *p; 
    *p = null; 
} 
4

没有任何测试的任何,我给你这个:

template <typename T> void deleteAndNull(T *&pointer){ 
    delete pointer; 
    pointer = 0; 
} 
+0

'T *&指针'?或者这个'T&指针'? – Nawaz 2011-03-24 06:06:46

+0

实际上我不确定语法,但我希望它是对指针的引用。我不确定,但我认为这将阻止尝试删除不是指针的东西 – Bwmat 2011-03-24 06:10:20

+2

@Nawaz:在这种情况下无关紧要::) – ybungalobill 2011-03-24 06:23:35

0

做到这将是无视操作最简单的方法删除对

  • 擦除内存
  • 清空指针

阅读有关运算符重载,是我的建议。 这样,您可以保留所有当前的代码,而无需经过努力将所有内容都改为函数调用。

+0

您不能覆盖'delete'运算符,只能'运算符delete'。 – fredoverflow 2011-03-24 07:36:21

+0

谢谢 - 改变它 – Prime 2011-06-06 23:10:54

4

无论如何,这并没有多大帮助,因为可能有多个指向已删除对象的指针。

int* p = new int; 

int* q = p; 

delete p; // how do we NULL q? 

最好的办法是使用删除p超出范围之前。或者使用标准容器,所以我们根本不需要新建/删除。

0

相同的答案您的其他指针的问题 - 使用smart pointer。重新发明轮子没有意义。

1

可能是一个使用auto_ptr指针将alos保存您的时间。

0

这样做是非常糟糕的做法。

他们表示,如果存在双重删除,它将保存程序免于崩溃。 唉,在删除它指向的对象之后使指针为NULL,只是掩盖了问题:您的程序包含错误。

我向你保证,你希望你的程序在这种情况下尽可能早地尽可能大声地崩溃。

14

您的建议有两个问题。

安全

你的建议的错觉引发安全的错觉。当然,标准保证,如果你在空指针上调用delete,它不会炸毁。但是,你忘记了一个小事实:没有一个指向你的对象的指针。

int* p = new int(8); 
int* q = p; 
delete p; p = 0; 
delete q; // Undefined Behavior 

因此,这种做法是没用的。而且因为一个虚假的安全感比差不多安全的差,我其实非常反感。希望人们在申请delete之前先考虑一下。

这给我们带来的第二个问题

你从来不敢使用delete

delete应保留至智能指针或其他容器实施者。以下适用:

  • 专家只有
  • (专家)不要*

* 有可能是你想达到什么样的一个已经存在的调试实现。

现有的工具来管理内存:

  • 智能指针的无处不在的各种口味的:std::unique_ptrstd::auto_ptr(取决于你的C++版本),std::scoped_ptrstd::shared_ptr(及其comparse std::weak_ptr,或它们的升压/ TR1当量)
  • 容器的无处不在的各种口味:boost::arrayboost::scoped_arraystd::vector(和共)
  • 和鲜为人知,但在OO非常有用:boost::ptr_vector(和CO)
  • 甚至还有boost::intrusive_ptr和升压介入式容器库或Boost的多指标库(与BIMAP衍生物)
  • ,可能其他一些提振图书馆,也许更专业,像Boost.Signals

有了这样的异类野生动物,很难认为你突然发现使用的数据是从我们做什么,你就需要别的东西完全不同的新方法。如果您有,请随时发布,我们将帮助您了解如何使用这些工具来适应您的情况(或为您提供关于如何创建新形式的智能指针的指示)。