0

realloc 関数のコーディングに問題があります。

標準の memcpy 手順で動作させていますが、最適化できません。現在のブロックを前方に拡張することと、現在のサイズのブロックが十分に大きいかどうかを確認すること (大きすぎる場合は、ブロックを分割してメモリを解放すること) の 2 つのケースに対応する必要があることはわかっています。

しかし、私はそれを正しく理解できないようです。私はいつもエラーが発生します。明確にするために、これらはコンパイル エラーではありません...これらは、トレース ドライバーで失敗するヒープ整合性チェックです。分割せずに実行すると、メモリが不足し、分割しようとすると、「元のブロック/データを保持できませんでした」と表示されます。

以下は私の通常のmemcpyコードです。中央のコメント セクションは、私の拡張の試みですが、大量の断片化を引き起こしているため、分割する必要があると思います。これにより、(1 つの) 再割り当てテスト中にメモリが不足し、エラーが発生します。コメント ブロックなしで実行すると、問題なく動作しますが、最適化はゼロです。

私の分割の試みは常に失敗します。一番下のコメントされたコードは私の試みです。ここで何が間違っていますか?

よろしくお願いします。:)

#define PACK(size, alloc) ((size) | (alloc))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))

void *mm_realloc(void *oldptr, size_t size)
{
    void *newptr;
    size_t copySize;
    copySize = GET_SIZE(HDRP(oldptr));
    size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(oldptr)));
//  if (copySize > size) return oldptr;

    /*if (!next_alloc) { 
        if ((GET_SIZE(HDRP(oldptr)) + GET_SIZE(HDRP(NEXT_BLKP(oldptr))))>size) {
        copySize += GET_SIZE(HDRP(NEXT_BLKP(oldptr)));
        PUT(HDRP(oldptr), PACK(copySize,1));
        PUT(FTRP(oldptr), PACK(copySize,1));
        return oldptr;
        }
    }*/

    newptr = mm_malloc(size);
    if (newptr == NULL)
      return NULL;
    if (size < copySize)
        copySize = size;
    memcpy(newptr, oldptr, copySize);
    PUT(newptr,GET(oldptr));
    mm_free(oldptr);
    return newptr;
}

//      int total_avail = (GET_SIZE(HDRP(oldptr)) + GET_SIZE(HDRP(NEXT_BLKP(oldptr))));
//      copySize -= (total_avail - size);
4

0 に答える 0