自定义malloc实现的问题

时间:2014-12-09 22:08:53

标签: c malloc heap

我正在使用自定义malloc并在C中自由实现。我的代码工作得很好,但并不完美。在我测试my_malloc和my_free的文件中,我调用了my_malloc 3次。它适用于前2个呼叫,但不适用于第3个呼叫。一切都完全一样,所以我真的不知道为什么它不能再工作了。我知道堆里有足够的内存,所以不是那样的。它甚至可以返回指针变量的地址,但测试文件不会写入它。

这里有一些代码来测试my_malloc和my_free,它打破了c:

static int *base;
static int *heap_end;
int total_mem_used = 0;
int first_call = 1;


int i;
int *a, *b, *c;

if ((a=(int *)my_malloc(10))==NULL)
    return MALLOC_FAIL;

for (i=0;i<10;i++)
    a[i] = i;

for (i=0;i<10;i++)
    printf("%d\n", a[i]);

if ((b=(int *)my_malloc(18))==NULL)
    return MALLOC_FAIL;

for (i=0;i<18;i++)
    b[i] = i*i;

for (i = 0; i < 18; i++)
    printf("%d ", b[i]);
printf("\n");

if ((c=(int *)my_malloc(5))==NULL)
    return MALLOC_FAIL;

for (i=0;i<5;i++)
    c[i] = i*7;

这里也是my_malloc,如果它有帮助:

void *p;
int *t;
int data_size, block;

if (size==0)
    return NULL;

if (first_call) {
    if ((base=(int *)malloc(HEAP_SIZE))==NULL)
        return NULL;
    init_heap(norm_size(size)+8);
    heap_end = &base[HEAP_SIZE];
    first_call = 0;
    total_mem_used += (norm_size(size)+2);
    t = base;
    return (void *) (t+2);
}

data_size = norm_size(size);
block = data_size + 2;

p = find_first_free(block);

if (p==0) {
    errno = ENOMEM;
    return NULL;
}

total_mem_used += block;
fill_header((int *) p, block);
t = (int *) p + 2;
return (void *) t;

void my_free(void *p) {
int *t;
t = (int *) p - 2;
*t = *t & -2;
coalesce(t);
}

void *find_first_free(int n) {
int *p;
p = base;

while (p<heap_end && ((*p & 1) || (*p <= n)))
    p = p + (*p & -2);
return (void *)p;
}

int norm_size(int w) {
if (w % 8 == 0)
        return w;
else
        return w + (8 - w % 8);
}

void init_heap(int n) {
base[0] = n+1; // n+1 since we're allocating it
base[1] = (int) &base[n];
base[n-1] = n+1;
base[n] = HEAP_SIZE - n;
base[HEAP_SIZE-1] = HEAP_SIZE - n;
}

 void fill_header(int *p, int w) {
 p[0] = w+1;
 p[1] = (int) &p[w];
 p[w-1] = w+1;
 p[w] = HEAP_SIZE - total_mem_used;
 p[w+HEAP_SIZE-total_mem_used-1] = HEAP_SIZE - total_mem_used;
 }

知道程序到底出了什么问题吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

避免使用魔术数字


block = data_size + 2;

为什么2?为什么不是16或256?当然,添加是为了节省大小。在这种情况下,请添加int

的大小
block = data_size + sizeof(int);

t = (int *) p + 2;

为什么2与任何其他数字?同样,这样做是为了考虑在p保存的大小开始。但这不像以前那样是整数加法。这是“指针添加”。使用+ 2时,p会增加2 * sizeof(int)。可能的代码应该是

t = p + 1;

这是“无魔数”规则的例外:-1,0,+ 1都可以


要回答更多问题,请发布完整的功能。


轻微:不需要施放

// if ((base=(int *)malloc(HEAP_SIZE))==NULL)
if ((base = malloc(HEAP_SIZE)) == NULL)

Minor:考虑无符号类型size_t。这是函数/运算符返回的类型,如strlen(),sizeof()

// int data_size
size_t data_size
// if ((a=(int *)my_malloc(10))==NULL)
a = my_malloc(10);
if (a == NULL)

init_heap(norm_size(size)+8);为什么8?使用常量/定义

#define MY_MALLOC_GUARD (8)
init_heap(norm_size(size) + MY_MALLOC_GUARD);