为什么我可以在没有segfaulting的[super dealloc]之后发布一个ivar?

Jer*_*y L 2 cocoa memory-management objective-c dealloc

似乎在Objective-C中,负责内存分配的方法(如malloc()在C中),是-[NSObject alloc].那释放那些记忆怎么样?这样做了-[NSObject dealloc]吗?这就是为什么在我们自己的班级里dealloc,我们必须打电话给[super dealloc]最后一个而不是第一个?

我问,因为我不明白为什么,如果我[super dealloc]先放,并[_bar release]在下一行使用释放对象,我不会得到分段错误.之后[super dealloc]运行,如果它释放对象的内存,_bar应该已经不属于该进程的内存块.

ben*_*ado 6

我想你是说,你有这个代码:

- (void)dealloc
{
    [super dealloc];
    [_bar release]; // _bar is a member variable
}
Run Code Online (Sandbox Code Playgroud)

并且你希望在第二行得到分段错误,但实际上你不是.

原因就是运气!

操作系统会捕获对您的进程不拥有的内存的访问权限,但它不会监控进程内发生的所有事情.在这种情况下,您正在访问已标记为可用的内存,但它仍属于您的进程,因此行为未定义.内存在几毫秒之前就有效了,所以很可能没有人开始重用这个内存页面,因此它可能仍然有有效的数据.所以它可能会成功.但它也可能失败.

这是错误的代码,你不应该发货.但仅仅因为它不正确并且未定义并不意味着它不起作用.

  • 在Xcode的方案编辑器中打开MallocScribble.上面的代码每次都会崩溃,因为内存将在free()上显式删除. (2认同)