3

私は Ptreads を使用した単純な OCR プログラムに取り組んでいますが、何らかの奇妙な理由でプログラムが単純な割り当てでクラッシュします。

クラッシュの原因となっている行は単純な代入です: int **y=(mask->imdata); すべてのポインターは問題ありません (malloc されたときとこの関数に渡されたときにチェックされ、それらは同じです)

Valgrind は次の出力を提供します。

==28948== Thread 2:
==28948== Invalid read of size 4
==28948==    at 0x804913A: PearsonCorrelation (ocr_pool.c:239)
==28948==    by 0x8049342: PearsonCorrelator (ocr_pool.c:275)
==28948==    by 0x80497BF: characterSegmentation (ocr_pool.c:407)
==28948==    by 0x8049A33: lineSegmentation (ocr_pool.c:489)
==28948==    by 0x8049D64: doPage (ocr_pool.c:575)
==28948==    by 0x4076954: start_thread (pthread_create.c:300)
==28948==    by 0x41565ED: clone (clone.S:130)
==28948==  Address 0x49d18f8 is 8 bytes inside a block of size 12 free'd
==28948==    at 0x4023B6A: free (vg_replace_malloc.c:366)
==28948==    by 0x80489ED: freeImage (ocr_pool.c:77)
==28948==    by 0x8049F33: main (ocr_pool.c:610)

ご覧のとおり、報告された無効な読み取りのサイズは 4 で、12 バイトの領域に 8 のオフセットがあります。

編集: Pthreads がなくても (pthreads_create() 呼び出しと同じ関数を実行)、問題なく動作します。1 つのスレッドを実行しているときでも、セグメンテーション違反が発生します。

4

1 に答える 1

1

上記のようなValgrindからのエラーが発生すると予想されるため、おそらくfree、読み取っているメモリを読み取る前に使用していると思います(ただし、それ自体がクラッシュにつながることは直接わかりません。 )。

を使用して以前に解放したメモリに書き込んでいる場合、セグメンテーション違反はプログラムの他の場所から発生している可能性がありますfree

于 2012-06-15T15:26:15.680 に答える