gpt4 book ai didi

c - 在c中选择动态创建的内存池

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:10 24 4
gpt4 key购买 nike

我创建了一个可以创建内存池的函数,但创建后如何选择它们?

boolean create_memory_pool(char *name, int size)
{
boolean result;
result = false;
name = malloc(size));
if( name != NULL)
result = true;

return result;
}

在 main 函数中,如果我创建了多个 1 内存池例如

int main()
{
boolean x;
x = create_memory_pool( "pool1", 1024);

x = create_memory_pool( "pool2", 2048);
x = create_memory_pool( "pool3", 2048);

// now how to select pool1 or pool2 or pool3
}

我想做的是创建一个名为 select 的函数,我可以通过它传递池的名称,并返回对调用的池的一些引用。

boolean select( char *name)
{
//return true if pool of name "name" is selected.
}

我想我需要声明一个全局变量 X,它作为对当前选定池的引用,该池在开始时为 NULL。在创建每个内存池时,我可以在“创建内存池”函数的末尾传递函数“select(name)”,因此在创建新内存池时,它将自动选择到全局 X。或者我可以传递名称我想选择的任何池。但我一直在思考它的实现。

最佳答案

我不知道你在找什么。我起初以为您只是想要 strdup(),但我猜不是。

如果你想通过名称访问分配的内存,那么你需要存储名称和分配的指针。

也许是这样的:

typedef struct {
const char *name;
void *base;
size_t size;
} memory_pool;

然后你可以实现:

memory_pool * memory_pool_new(const char *name, size_t size)
{
memory_pool *p = malloc(sizeof *p + size);
if(p != NULL)
{
p->name = name; /* Assumes name is string literal. */
p->base = p + 1;
p->size = size;
}
return p;
}

然后你可以在你的主程序中有一个池数组:

memory_pool *pools[3];
pools[0] = memory_pool_new("foo", 17);
pools[1] = memory_pool_new("bar", 42);
pools[2] = memory_pool_new("baz", 4711);

现在很自然地可以编写一个可以在数组中按名称查找内存池的函数:

memory_pool memory_pool_array_find(memory_pool **pools, size_t num,
const char *name)
{
for(size_t i = 0; i < num; ++i)
{
if(strmcp(pools[i]->name, name) == 0)
return pools[i];
}
return NULL;
}

然后您可以使用上面的方法找到您创建的池之一:

memory_pool *foo = memory_pool_array_find(pools, 3, "foo");
if(foo != NULL)
printf("found the memory pool %s, size %zu\n", foo->name, foo->size);

关于c - 在c中选择动态创建的内存池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20142599/

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