2010-01-09 64 views

回答

13

不,它不会,因为释放没有权力改变指针。它只能做到这一点是你通过指针到指针。

如果你想确保它设置为零,你必须自己动手。

有些人认为这是一个很好的做法,有些人认为这是浪费时间,因为你的代码应该被构造成在释放后(直到重新分配之前)不使用指针。我实际上倾向于后者阵营,但我可以明白为什么人们想要保护自己免于获得释放的内存(编程防御几乎不是一个坏主意)。

+0

我设置宏安全地释放指针并将其设置为'nil'。 – notnoop 2010-01-09 05:16:01

+0

+1 FYI,使用垃圾回收时,'__weak'指针是“自我调零”。此外,使用宏来做到这一点可能容易出错,正如我在下面的答案中提到的那样。 – 2010-01-09 16:38:51

+1

如果在释放时没有设置为零的引用,那么泄漏将无法告诉您存在内存泄漏 - 毕竟就泄漏而言,您拥有有效的引用,即使您认为引用不再有效(过度保留)。 – 2010-01-10 05:34:39

2

我不确定指针是否为零,或者它指向的是无效数据,但是它的良好编码约定在您释放它们之后将其指定为零。

+0

+1这是很好的建议,特别是对实例和静态变量,垃圾收集,其中可能会意外积累的期望不会被回收到不必要的记忆力强的参考下更是如此。我认为有些人只是想要一个神奇的子弹解决方案,所以他们不必考虑这个问题。 – 2010-01-09 16:31:51

1

想到这情况:

void *p = malloc (100); 

while (someCondition) 
{ 
    // do something with p 
} 

free (p); 

// p is not set to NULL for you, it still points to where it always did 

类似地,当一个Objective-C的对象被释放,任何指向该对象仍然指向它在哪里。当另一个对象被分配到相同的空间时(或者即使没有任何东西被分配到同一空间中),这会导致错误。

5

在正常的保留释放记忆模型下,没有。启用垃圾回收后,如果指针被声明为__weak(对于Objective-C对象,默认值为__strong),就会发生这种情况。垃圾收集器会在您处理时为您清零弱引用,这使得它们非常适合指向代理和半瞬态对象。另请参阅NSPointerArray,NSMapTableNSHashTable以及他们对弱关系的支持。 (注:人们必须明白,弱引用不会阻止对象被垃圾收集;当没有强引用指向同一地址时,它将被清零。请参阅this document以获取此行为的简要摘要。)

有Objective-C垃圾收集有很多其他好处,如果可以的话,我衷心推荐使用它。 (它可以在OS X 10.5+上使用,但不能在iPhone OS上使用。)Snow Leopard中的性能改进最令人印象深刻,而且一开始它就已经很快成型了。

也就是说,@darren有一个好处:在释放其内容时,通常是很好的做法。如果你正在寻找避免指向过度释放对象的指针,最好的办法就是采用习惯于自己修改变量。它不会导致运行时间开销,并且它是可读的。更重要的是,将变量设置为零有助于垃圾收集系统最有效地工作,因为它指示可以安全回收的内存。该代码也可以在两种模式下完美工作。

不过,我一般零出-dealloc值,因为你正在修改的记忆即将被收回,如果代码的其他部分可能会出错,由于使用释放值,他们不应该使用释放对象来开始。 (这通常发生在一个对象没有正确保留另一个对象时,并且后者被释放,留下一个dangling pointer。)可能的例外情况可能包括分段拆卸,其中非零引用可能会导致dealloc本身出现问题,但这种类型的行为通常不会(也不应该)在销毁对象时发生。