【问题标题】:selecting dynamically created memory pools in c在c中选择动态创建的内存池
【发布时间】:2013-11-22 10:30:07
【问题描述】:

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

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

  return result;
}

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

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。或者我可以传递名称我想选择的任何池。 但我一直在思考它的实现。

【问题讨论】:

  • 当你说“内存池”时,你是什么意思?听起来好像您只是指动态分配的字符串? “内存池”通常是在内存分配实现中使用的东西,例如,它包含“一个”可用内存池,您可以从中进行分配。你的问题很混乱。
  • 您需要创建一个列表来跟踪这些指针。
  • 创建的池与char *变量中的名称没有关系。事实上,这个价值只是被忽略了。如果要存储链接到名称的指针,则必须自己处理数据结构。为什么你认为这样的事情是可能的,因为 C 语言的一部分是我无法理解的。
  • @SJuan76 对不起,我是 c 的新手。我也在考虑列表。

标签: c memory-management pool


【解决方案1】:

我不知道你在追求什么。我一开始以为你只是想要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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2013-04-04
    • 2021-05-05
    相关资源
    最近更新 更多