2

私のコードで何か奇妙なことが起こっています。基本的には、iOSのリングバッファメモリにデータを転送し、その後メモリを読み取るネットワークストリームアプリケーションを実行しています。EXC_BAD_ACCESS不確定な量のデータを取得していました。だから私は有効 NSZombieEnabledにして設定しNSAutoreleaseFreedObjectCheckEnabledmalloc_error_breakエラーの原因を特定することができました。

MainClassはプロパティを持っています(これも強い参照で試されました、同じ動作)

@property(非アトミック、保持)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メソッドを使用してリングバッファにデータを挿入します

- (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メモリを解放した可能性はありますか?

4

2 に答える 2

2

ARCがcallocedメモリを解放した可能性はありますか?

いいえ、それは不可能です。自動参照カウントの略語であるARCは、有効にすると、コンパイルされたコードにメモリ呼び出しを直接挿入することにより、ObjectiveCオブジェクトの自動メモリ管理を提供するコンパイラ機能です。bufferはObjectiveCオブジェクトではなく、ヒープ上に割り当てられたメモリブロックへのポインタであり、ARCによって解放されないためです。この割り当てられたメモリブロックを自分で解放するのはあなたの義務です。

ARCの仕組みの詳細については、AppleのWWDC 2011セッションビデオ:自動参照カウントの紹介をご覧ください。

基本的に、私が理解していないのは、なぜこれが問題を引き起こしているのですか?

言うのは難しいですが、問題は、のm_head場合にのみゼロに設定されることである可能性がありますm_head == size && overflow == FALSE。この条件は、(オーバーフロー== FALSEであるため)最初にm_head等しい場合にのみ真になりますが、等しい(および0にリセットされない)ためm_size、次回はにm_head等しいm_sizeため、真ではなくなります。overflowTRUEm_head

于 2012-10-15T21:58:37.760 に答える
1

if-conditionがTRUEに達すると、オーバーフローがTRUEに設定されます。ただし、このプログラムはオーバーフローをFALSEにリセットすることはありません。したがって、m_headは大きく成長し続けています。ゼロにリセットしないでください。結果、バッファ[m_head]が予約済みメモリからアクセスします。

わかった?

于 2012-10-15T21:46:05.190 に答える