gpt4 book ai didi

c - Mempool amd memcheck 在 C 中的实现

转载 作者:行者123 更新时间:2023-11-30 20:39:47 26 4
gpt4 key购买 nike

**有没有办法重用内存池中取消分配的内存**

我想释放某些已用内存块,并想再次将其返还给内存池。

我预先分配了一定量的内存,并将该内存用于程序的其余部分。该程序基本上将为一个结构分配内存。

例如,我最初创建了 100Kb 的内存分配,之后我想以 30Kb 的 block 大小使用该内存。

我如何实现“memcheck”来检查内存池中损坏的内存。

我已经创建了这样的内存池

#include <stdio.h>
#include <stdlib.h>

typedef 结构体 POOL{

    char *next;
char *end;

}池;

池*pool_create(size_t大小){

    pool *p = (pool*)malloc (size + sizeof (pool));
p->next = (char*)&p[1];
p->end = p->next + size;

return p;

}

void pool_destroy(池*p){

    free (p);
p = NULL;

}

size_t pool_available(池*p){

    return p->end - p->next;

}

void *pool_alloc(池*p,size_t大小){

    if (pool_available(p) < size) {
printf ("oops!!! No memory left in mempool\n");
return NULL;
}
void *mem = (void *)p->next;
p->next +=size;
printf ("memeory successfully allocated from pool\n");
return mem;

}

int main(){

    pool *my_pool = pool_create (100);
pool *use1,*use2,*use3,*use4;

printf ("pool_available is %d\n\n",pool_available(my_pool));

use1 = pool_alloc (my_pool, 30);
printf ("pool_available is %d\n\n",pool_available(my_pool));

use2 = pool_alloc (my_pool, 30);
printf ("pool_available is %d\n\n",pool_available(my_pool));

use3 = pool_alloc (my_pool, 30);
printf ("pool_available is %d\n\n",pool_available(my_pool));

use4 = pool_alloc (my_pool, 50);
printf ("pool_available is %d\n\n",pool_available(my_pool));

return 0;

}

在这段代码中,我想释放 use2 内存块和 wnat 来再次恢复该内存。

现在mempool中的总内存是10。释放use2后,总内存将是40。那么我如何安全地释放use2并在mempool中再次使用这个 block 。

最佳答案

您必须有一个等效的 pool_dealloc (或 pool_free 但要调用它)函数,该函数将通过指向其开头的指针释放池存储的一 block 。该区域的释放实际上并不是对 free 的调用,但您必须将该区域添加到空闲 block /区域的列表中,以便 pool_alloc 可以重用它。现在,上面的实现非常幼稚,因为您无法在没有额外数据结构的情况下实现池分配器,这些数据结构将负责跟踪 block 大小等以及空闲/占用 block ,因此我建议您阅读有关如何实现各种分配器的信息并尝试理解其中的复杂性,你应该能够找到很多信息。一般来说,它并不像上面显示的那样简单,特别是如果您想要一个强大且可扩展的解决方案。如果您想按照上述方式执行此操作,则需要保留一个可用的指针和大小列表并相应地对其进行操作。

关于c - Mempool amd memcheck 在 C 中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com