2

したがって、私のこのコードには次のreallocブロックがありました。

char **ptr = NULL;

void realloc_ptr(unsigned int new_size)
{    
    void *temp = NULL;

    temp = realloc(ptr, new_size * sizeof(*ptr));

    if(temp != NULL) {
        ptr = temp;
    }
    else {
        exit(EXIT_FAILURE);
    }
}

new_sizeこの関数が呼び出される直前にインクリメントされます。この配列は常に展開されるだけです。また、new_size私のコードでは 3 を超えることはありません (今のところ)。

上記のrealloc呼び出しは、Windows 7 でのテスト中に正常に機能しました。このコードを XP でテストしたところ、上記のコードは 3 回成功し、4 回目に例外がスローされました。コードに戻ったら、正確な例外を投稿します (このコンピューターにはコードがありません)。

メモリが断片化しすぎて、システムが連続したメモリ ブロックを割り当てることができなかったと推測しています。コードのメモリ リークをテストし、すべて修正しました (願わくば)。なぜこれが起こっているのですか?

編集:

Doug Lea のmalloc.cを使用すると、上記の問題はなくなりました。しかし、なぜこれが起こったのかを知りたいです。

ありがとう!

4

2 に答える 2

2

私の最善の推測はnew_size、連続した仮想メモリで利用するには大きすぎるということです。大量の連続した仮想メモリが 32 ビット システムで使用可能であることを確認することはできません。

一般に、複数の小さなブロックを使用するようにし、可能であればそれらをすべて同時に割り当てるのではなく、前のブロックが解放された後に次のブロックを割り当てる必要があります。

于 2013-02-17T09:11:49.850 に答える
2

このコードを XP でテストしたところ、上記のコードは 3 回成功し、4 回目に例外がスローされました。コードに戻ったら、正確な例外を投稿します (このコンピューターにはコードがありません)。

それ(例外)は、無効なポインター(またはインデックス)がどこかにある(おそらく初期化されていない)か、メモリが破損していることを意味します。realloc()要求を満たすことができない場合は、サイレントに失敗し、NULL を返す必要があります。

また、異なる OS で異なる動作をすることは完全に正常です。

于 2013-02-17T09:14:24.910 に答える