-1

素晴らしいサイト..私のプログラムにこのエラーがあり、私が free() ポインタ型を構造化すると発生します..理由を理解できないようです..しかし、ポインタがグローバルに宣言されているという事実に関係していると思います. ご協力ありがとうございました!

*「prev」、「current」、および「head」はグローバルであり、malloc() を使用して別の関数に割り当てられることに注意してください。

コード:

    void approve_delete(int* delete_request){
    if(*delete_request == 0){
        cout<<" there are no more delet requests\n";
        return;
    }
    char choice[5];
    char ch;

    current = head;
    Prev = head;
    while (current->user.id != MAX_ID ){
        if(current->user.want_delete == true){
            cout<<"name : "<<current->user.name<<" "<<current->user.last_name<<" id:   "<<current->user.id<<endl;
            ch=0;
            while( ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N') {
                cout<<"approve delete? Y/N  or (Q)exit\n";
                cin.width(5);
                cin>>choice;
                ch=choice[0];
                switch (ch) {
                case 'y':
                case 'Y':
                    item* Temp = current;
                    Prev->next = Prev-> next->next;
                    current=Prev->next;
                    free(Temp);       //here the error occur! 
                    cout<<"in";
                    *delete_request -= 1;
                    cout<<"student deleted\n";
                    break;
                case 'n':
                case 'N':
                    break;
                case 'q':
                case 'Q':
                    return;
                }
            }
        }
        Prev = current;
        current = current->next;
    }
}
4

4 に答える 4

1

次のコード行を見て、デバッグしてみましょう。

1. item* Temp = current;
2. Prev->next = Prev-> next->next;
3. current=Prev->next;
4. free(Temp);

Temp最初の行は、 (未知の) へのポインターを定義itemし、現在の を指すように初期化していitemます。確かにこれはうまくいきます。

2 行目は、そのポイントのフィールドnextを3 番目の に割り当てています。しかし、2番目はどうなりますか?それはどこに行きましたか?これは、ここでのメモリ リークです。itemPrevitemitem

current3 行目は、上記のように 3 行目を指すように割り当てitemます。2番目がどこに行ったのかまだわかりませんitem...

そして最後に 4 行目が解放されTempます。確かに、それは何も悪いことではありませんが、2番目がどこにitem行ったのかまだ混乱していますか?

そのスニペットの 2 行目にメモリ リークがあります。これは、何もポイントしないように作成しているためでありitem、そのために割り当てられたメモリ ブロックを解放することはできませんitem

于 2013-08-09T08:19:12.477 に答える
0

無料になる前のある時点で、あなたは自分のものではないメモリに書き込みました。malloc で割り当てられた配列の範囲外のインデックスにアクセスした可能性があります。すでに解放したメモリにアクセスした可能性があります。原因が何であれ、これらの問題はデバッグが難しい場合があります。

あなたは Windows を使っているので、ページヒープ ツールが役立つかもしれませんが、私はそれを使用していないので、お手伝いできません。

また、Jacob は、最初の項目を削除しようとするとコードが壊れているという点で正しいです。

于 2013-08-09T11:19:29.503 に答える
0

エラーは、コードの別の部分から発生しています。コード全体を見た後 (私は彼と内密に話しました)、問題は型の不一致が原因でした。

'item' は、2 つの boolean メンバーを持つ構造体です (最後のメンバーは bool 型です)。構造体にデータを入力する関数は、ファイルからのデータを使用しています。ファイルから読み取るために、彼は fscanf() を使用し、"%d%d" を使用して数値を読み取ることによってブール メンバーのデータを取得しました。整数はブール値よりも多くのメモリを占有するため、ヒープが破損しました。

于 2013-08-09T17:42:07.450 に答える
-1

ほとんどの場合、「現在の」ノードは null です。null ポインターを逆参照しようとすると、メモリ例外が発生します。

  1. 現在のオブジェクトがnullではないことを推測できるノードの値を出力してみてください。この場合、free(node)が機能しない理由はありません。

PS: 動的に作成されたオブジェクトを操作する前に、必ず「null」チェックを実行してください。

             if(temp!=null){
              free(temp);
               }

お役に立てれば。

ありがとう、シヴァ・シャンカール

于 2013-08-09T08:18:55.480 に答える