菜鸟教程小白 发表于 2022-12-13 17:08:36

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


                                            <p><p>我的代码中发生了一些奇怪的事情。基本上我正在做网络流应用程序,将一些数据传输到 iOS 上的环形缓冲区内存中,然后读取内存。
在一些不确定的数据量之后,我得到了 <code>EXC_BAD_ACCESS</code>。所以我启用了 <code>NSZombieEnabled</code> 和 <code>NSAutoreleaseFreedObjectCheckEnabled</code> 并设置了 <code>malloc_error_break</code> 并且能够查明错误的原因。</p>

<p>我的 <code>MainClass</code> 具有该属性(也尝试过强引用,相同的行为)</p>

<blockquote>
<p>@property (nonatomic, retain) RingBuffer *readBuffer;</p>
</blockquote>

<p>在 <code>RingBuffer</code> 类中,我将缓冲区大小初始化为:</p>

<pre><code>-(id) initWithSize: (NSInteger) size
{
    self = ;
    m_size = size;
    buffer = (unsigned char *)calloc(m_size, sizeof(unsigned char));
    overflow = FALSE;
    m_tail = 0;
    m_head = 0;
    error = 0;
    return self;
}
</code></pre>

<p>之后,我使用 push 方法在 ringbuffer 中插入数据</p>

<pre><code>- (void) push: (unsigned char) byte
{
    if (m_head == m_size &amp;&amp; overflow == FALSE) {
      m_head = 0;
      overflow = TRUE;
      }
    buffer = byte;
    m_head ++;
    if (overflow) m_tail++;
    if (m_tail == m_size) m_tail = 0;
}
</code></pre>

<p>如果我删除推送调用,应用程序不会崩溃。如果调用推送调用,它会在一段时间后崩溃。有时我得到 <code>alloc: *** error for object 0x1cad3404: wrong checksum for freed object - object 可能在被释放后被修改。
*** 在 malloc_error_break 中设置断点进行调试</code>...有时只是 EXC_BAD_ACCESS。 </p>

<p>基本上,我不明白为什么会导致这个问题? ARC是否有可能释放了calloced内存?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><blockquote>
<p>Is it possible that ARC released the calloced memory ?</p>
</blockquote>

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

<p>要详细了解 ARC 的工作原理,请观看 Apple 的 WWDC 2011session 视频:<a href="https://developer.apple.com/videos/wwdc/2011/#introducing-automatic-reference-counting" rel="noreferrer noopener nofollow">Introducing Automatic Reference Counting</a> .</p>

<blockquote>
<p>Basically, what i don&#39;t understand is why is this causing the issue ?</p>
</blockquote>

<p>很难说,但问题可能是 <code>m_head</code> 仅在 <code>m_head == size && overflow == FALSE</code> 时设置为零。此条件仅在第一次 <code>m_head</code> 等于 <code>m_size</code> 时为真,(因为溢出 == FALSE),但在下一次 <code>m_head</code> 时不再为真> 等于 <code>m_size</code>,因为 <code>overflow</code> 等于 <code>TRUE</code>(并且 <code>m_head</code> 不会重置为 0)。</p ></p>
                                   
                                                <p style="font-size: 20px;">关于ios - ARC 正在释放 calloc&#39;ed 内存?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12902778/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12902778/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - ARC 正在释放 calloc&#39;ed 内存?