Ios ARC正在释放calloc';有记忆吗?
我的代码中发生了一些奇怪的事情。基本上,我在做网络流应用程序,将一些数据传输到iOS上的环形缓冲内存中,然后读取内存。 在一些不确定的数据量之后,我得到了Ios ARC正在释放calloc';有记忆吗?,ios,automatic-ref-counting,calloc,Ios,Automatic Ref Counting,Calloc,我的代码中发生了一些奇怪的事情。基本上,我在做网络流应用程序,将一些数据传输到iOS上的环形缓冲内存中,然后读取内存。 在一些不确定的数据量之后,我得到了EXC\u BAD\u ACCESS。因此,我启用了NSZombieEnabled和NSAutoreleaseFreedObjectCheckEnabled,并设置了malloc_error_break,并且能够精确定位错误原因 MyMainClass具有该属性(还尝试了强引用,行为相同) @属性(非原子,保留)RingBuffer*readB
EXC\u BAD\u ACCESS
。因此,我启用了NSZombieEnabled
和NSAutoreleaseFreedObjectCheckEnabled
,并设置了malloc_error_break
,并且能够精确定位错误原因
MyMainClass
具有该属性(还尝试了强引用,行为相同)
@属性(非原子,保留)RingBuffer*readBuffer
在RingBuffer
im类中,将缓冲区大小初始化为:
-(id) initWithSize: (NSInteger) size
{
self = [super init];
m_size = size;
buffer = (unsigned char *)calloc(m_size, sizeof(unsigned char));
overflow = FALSE;
m_tail = 0;
m_head = 0;
error = 0;
return self;
}
之后,我使用push方法在ringbuffer中插入数据
- (void) push: (unsigned char) byte
{
if (m_head == m_size && overflow == FALSE) {
m_head = 0;
overflow = TRUE;
}
buffer[m_head] = byte;
m_head ++;
if (overflow) m_tail++;
if (m_tail == m_size) m_tail = 0;
}
如果删除推送调用,应用程序将不会崩溃。如果调用push调用,它将在一段时间后崩溃。有时我会得到alloc:**对象0x1cad3404的错误:已释放对象的校验和不正确-对象可能在被释放后被修改。
***在malloc\u error\u break中设置断点以调试
。。。有时,这只是一个例外
基本上,我不明白的是,为什么这会导致这个问题?是否可能ARC释放了calloced内存?在达到“如果条件为真”后,溢出设置为真。 但是,此程序从不将溢出重置为FALSE。 所以,m_head正在继续成长。 永远不要重置为零。 结果,缓冲区[m_head]从保留内存中访问 好吗 有没有可能ARC释放了calloced内存 不,那是不可能的。ARC是自动引用计数的缩写,是一种编译器功能,如果启用,它可以通过将释放、保留和自动释放内存调用直接插入到编译代码中来提供对目标C对象的自动内存管理。因为
buffer
不是一个Objective C对象,而是一个指向堆上分配的内存块的指针,它不是由ARC释放的。您有义务自己释放分配的内存块
要了解更多有关ARC工作原理的信息,请查看苹果公司的WWDC 2011会议视频:
基本上,我不明白的是,为什么这会导致这个问题
很难说,但问题可能是只有当
m_head==size&&overflow==FALSE
时,m_head
才会设置为零。此条件仅在第一次m_head
等于m_size
(因为溢出==FALSE)时为真,但在下次m_head
等于m_size
时不再为真,因为溢出等于true
(并且m_head
不会重置为0)。如果调用OC m_size bytes,您应该只写0..m_size-1。当m_head==m_size时写入缓冲区[m_head]通常会触发异常。我忘了包括if(m_head==m_size)m_head=0;在代码末尾。。。我现在无法证实这是否导致了这个特定的问题。最有可能,但我会在验证时添加注释。Thanx指出了事实是的就是这样。。对不起,苹果,与ARC的实现无关:)Thanx。