2

Xcode で非常に一貫性のないエラーが発生します。

malloc: *** error for object 0x1041146f8: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug

32 ビット ビルドは正常に動作するため、それが私のコードではないことはわかっています (アーキテクチャは Standard 32/64 に設定され、Build Active Architectures Only は No に設定されています)。また、コメントを変更しなくても問題なく動作することもありますが、約 10% の確率でしかありません。

ブレークポイントを使用してエラーを追跡しました。myClass = new MyClass のような ivar で発生することもありますが、関連のない ivar を削除すると発生することもあります。新しいインスタンスを作成する前に myClass を null に設定しようとしましたが、それは役に立ちませんでした。キャッシング、レジスタ、ヒープ、およびスタックを完全に理解していないため、途方に暮れています (理由についての洞察が得られる可能性があります)。これは事件です)。

エラーが発生している場所のコードの一部を次に示します。コードの行の各セットは、エラーが発生する場合と発生しない場合がある別の場所とクラスであることに注意してください。

エラー 1

void functionA() {
    // bunch of unrelated code
    if (aAinterpFilter)
        delete aAinterpFilter;

    // this is where the first error sometimes happens
    aAinterpFilter = new InterpFilter((Window::Sinc::LP*)filterDesign, aAinterpFactor);
}

エラー 2

Window::Sinc::LP::~LP ()
{
    // the z delete is where the error sometimes happens
    delete[] z;
    delete[] kernel;
}

エラー 3

void AAOsc :: setPhase(double phase) {
    if (phase < 0.0) phase = 0.0;
    if (phase > 1.0) phase = 1.0;

    // this is where the error rarely happens, but it does sometimes.
    osc->tickInfo->curvPhase = static_cast<uint>(phase * 4294967296.0);
}

解決策を示す可能性のあるアイデアは大歓迎です。

GW

4

1 に答える 1

0

提案された関数にブレークポイントを追加する必要がありますmalloc_error_break()。アプリを実行し、デバッガーがその関数でブレークできるようにします。スタック フレームを 1 つか 2 つ戻すと、OS がどの変数を変更したと見なして解放したかがわかります。次に、その変数が以前に解放された可能性のある場所を特定する必要があります。

これは、編集してから書き込むメモリのブロックがあり、返されたポインターの前にmalloc誤って数バイトを書き込んだ場合にも発生する可能性があります。ガード mallocを有効にして、再度発生させることで、これをキャッチできます。malloc

于 2013-01-14T05:19:01.963 に答える