0

アプリの C ベースの部分で非常に大きなサイズの配列 (サイズ > 10 000) を使用する Objective-C (iOS) アプリケーションを開発しています。

実行の瞬間、作成した小さな構造体の malloc を作成します。次のメッセージがあります。

      malloc: *** error for object 0x6505a4: incorrect checksum for freed object - object was probably modified after being freed

メッセージによって指定されたアドレスは、この呼び出しの前に使用した配列によって既に取得されています。

 write in address : 0x6505a0  - im_x[12]  // im_x is my array 
 write in address : 0x6505a8  - im_x[13]  // im_x is my array 

iOS が既に使用されているメモリを割り当てようとするのはなぜですか?

どんな助けでも大歓迎です:)

ありがとう !

4

3 に答える 3

0
  malloc: *** error for object 0x6505a4: incorrect checksum for freed object - object was probably modified after being freed

は、ヒープのデータ構造がどこかで破損したことを知らせるメッセージです (バッファー オーバーフロー、アンダーフロー、その他の奇妙な魔法)。

(これがオプションの場合) を使用してプログラムをデバッグしてみてください。valgrindまたは、メモリ破損の疑わしいコードを分離して valgrind でデバッグしようとしない場合は、重要なデータ構造を上書きするバグがどこかにあるはずです。

ヒープに

この奇妙なエラー メッセージを説明するために、面白い ASCII アートをいくつか示します。

  • F : フリーブロック/バイト
  • M : メモリ管理構造体

    FFFFFFFF

アプリケーションはメモリを 2 回 (A と B) 割り当てます。

次のようなものを取得します

AMBBBMFF

ここに記憶の中に今を書き込めば

AMBBBMFF
 ^
here

ヒープのデータ構造を破壊したため、A または B のチェックサムが間違っているため、エラー メッセージが出力されます。

于 2013-04-08T12:01:09.977 に答える