我创建了一个可以创建内存池的函数,但是如何在创建它们之后选择它们?
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.或者我可以传递名称我要选择的任何游泳池。 但我一直在考虑它的实施。
答案 0 :(得分:3)
我不知道你在追求什么。我首先想到你只想要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);