0

iPhoneアプリケーションでaclibを使用しています。c libは、私がアクセスできない誰かによって書かれています。

ただし、オブジェクト0xa6000dが解放されているが、割り当てられていないというエラーが発生します。デバッグ変数のスクリーンショットはこちらです。

ここに画像の説明を入力してください

struct GtsMsgは、次のように定義されます。

struct msg {
    int offset;
    int dataLength;
    u8* data;
    cBool expandable;
    cBool owned;
    u8* mid2key;
};

#define GtsMsg struct msg


void freeMessageData(GtsMsg* msg) {
    if (msg == NULL) return;
    if (msg->owned) {
        if (msg->data != NULL) {
            free(msg->data);
        }
    }
    free(msg->mid2key);
    memset(msg, 0, sizeof(GtsMsg));
}

malloc_error_breakのブレークポイントは、行free(msg-> data)です。

(msg-> data!= NULL)かどうかのチェックを追加しましたが、機能しませんでした。msg-> dataまたはmsgのメモリが割り当てられているかどうかを確認する方法は何ですか?

* data =(u8)'\ 0'に何か怪しいものがあると思いますか?

前もって感謝します!

4

1 に答える 1

0

あなたの提案に感謝します。ヒントをありがとうhmjd。

構造体がfreeMessageDataを呼び出すcppクラスで使用されていることがわかりました。しかし、構造体が初期化されていることがわかりませんでした。したがって、宣言で構造体をNULLに初期化すると、メモリの解放の問題が回避され、クラッシュしなくなります。

その何かはsimoncによって提案されました。彼がそれを答えとしてではなく、コメントとして書いたなら、私はそれを受け入れることができます。

のコメントからhmjd

渡されたポインタがNULLの場合、free()はノーオペレーションになるため、NULLのチェックは役に立ちません。ポインタがNULLでないからといって、それが有効なメモリ位置を指しているとは限りません(メモリがすでに解放されているか、ポインタがNULLに初期化されていない可能性があります)。ポインターを解放する前に、ポインターが有効であることを確認するのはプログラマーの責任です。

于 2013-02-15T12:21:08.527 に答える