Cプログラムで単純なメモリマネージャー(実際にはメモリトラッカーと言うべきです)を書こうとしています。
私は基本的に、割り当てられたブロックの二重にリンクされたリストを作成しており、各ブロックの開始時に前と次にポインターを置きます。Malloc プロシージャは次のようになります。
typedef struct MemUnit TMemUnit;
struct tMemUnit
{
TMemUnit *prev;
TMemUnit *next;
}
TMemUnit *new = malloc(sizeof(TMemUnit) + wantedSize);
if (new == NULL)
/* ERROR */
else
{
if (memFirst == NULL) {
memFirst = new;
memLast = new;
new->prev = NULL;
new->next = NULL;
} else {
new->prev = memLast;
new->next = NULL;
memLast->next = new;
memLast = new;
}
return (void *)(new + sizeof(TMemUnit));
問題は、以前はなかった場所でのセグメンテーション違反です。
Valgrind も無効な読み取り/書き込みエラーを返します。
==22872== Invalid write of size 4
==22872== at 0x400FF1: main (test-memory.c:40)
==22872== Address 0x54d51b0 is not stack'd, malloc'd or (recently) free'd
このエラーに対して割り当てられたブロックのアドレスを出力すると (wantedSize = 20 * sizeof(int)、最初の int を書き込もうとしています)、それらは問題ないように見えます:
new --> 0x54d5030
new + sizeof(TMemUnit) + wantedSize --> 0x54d5430
どこが間違っているのかわかりません。
ありがとう