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

时间:2013-11-22 10:30:07

标签: c memory-management pool

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

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.或者我可以传递名称我要选择的任何游泳池。 但我一直在考虑它的实施。

1 个答案:

答案 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);