【发布时间】:2012-10-15 19:38:12
【问题描述】:
我的代码中发生了一些奇怪的事情。基本上我在做网络流应用程序,将一些数据传输到 iOS 上的环形缓冲区内存中,然后读取内存。
在一些不确定的数据量之后,我得到了EXC_BAD_ACCESS。所以我启用了NSZombieEnabled 和NSAutoreleaseFreedObjectCheckEnabled 并设置了malloc_error_break 并且能够查明错误的原因。
我的MainClass 拥有该属性(也尝试过强引用,相同的行为)
@property (nonatomic, retain) RingBuffer *readBuffer;
在RingBuffer 类中,我将缓冲区大小初始化为:
-(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;
}
如果我删除推送调用,应用程序不会崩溃。如果调用推送调用,它会在一段时间后崩溃。有时我得到alloc: *** error for object 0x1cad3404: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug...有时它只是EXC_BAD_ACCESS。
基本上,我不明白为什么会导致这个问题? ARC是否有可能释放了calloced内存?
【问题讨论】:
-
如果你调用 m_size 字节,你应该只写入 0..m_size-1。当 m_head == m_size 时写入缓冲区[m_head] 通常会触发异常。
标签: ios automatic-ref-counting calloc