• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - ARC 正在释放 calloc'ed 内存?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 17:08:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的代码中发生了一些奇怪的事情。基本上我正在做网络流应用程序,将一些数据传输到 iOS 上的环形缓冲区内存中,然后读取内存。 在一些不确定的数据量之后,我得到了 EXC_BAD_ACCESS。所以我启用了 NSZombieEnabledNSAutoreleaseFreedObjectCheckEnabled 并设置了 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: wrong checksum for freed object - object 可能在被释放后被修改。 *** 在 malloc_error_break 中设置断点进行调试...有时只是 EXC_BAD_ACCESS。

基本上,我不明白为什么会导致这个问题? ARC是否有可能释放了calloced内存?



Best Answer-推荐答案


Is it possible that ARC released the calloced memory ?

不,这是不可能的。 ARC 是 Automatic Reference Counting 的缩写,是一种编译器功能,如果启用,它会通过将释放、保留和自动释放内存调用直接插入到编译代码中来提供 Objective C 对象的自动内存管理。由于 buffer 不是 Objective C 对象,而是指向堆上已分配内存块的指针,ARC 不会释放该内存块。您有义务自己释放这 block 已分配的内存。

要详细了解 ARC 的工作原理,请观看 Apple 的 WWDC 2011 session 视频:Introducing Automatic Reference Counting .

Basically, what i don't understand is why is this causing the issue ?

很难说,但问题可能是 m_head 仅在 m_head == size && overflow == FALSE 时设置为零。此条件仅在第一次 m_head 等于 m_size 时为真,(因为溢出 == FALSE),但在下一次 m_head 时不再为真> 等于 m_size,因为 overflow 等于 TRUE(并且 m_head 不会重置为 0)。

关于ios - ARC 正在释放 calloc'ed 内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902778/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap