【问题标题】:What happened with the relocating allocator?重定位分配器发生了什么?
【发布时间】:2016-01-07 04:30:51
【问题描述】:

我在阅读旧的 glibc 文档 here 时看到了三个我以前从未见过的奇怪函数(r_alloc、r_alloc_free 和 r_re_alloc)。我认为,他们实现了一个分配器,可以重新分配内存以进行碎片整理,但我在其他任何地方都找不到更多信息。

你能告诉我更多关于这些功能的信息吗?他们还在 Glibc 中吗?如果不是,为什么要删除它们?

【问题讨论】:

  • 根据经验,未记录的函数是供“内部”使用的。即使它们还没有被删除,随着 glibc 内部设计的发展,它们可能会在任何未来版本中被删除、重命名或更改。
  • @MSalters 函数既不是内部的,也不是未记录的:问题询问在(旧)文档中找到的函数。
  • 如果你想复制或压缩垃圾回收,C 语言可能不适合你。

标签: c gnu glibc


【解决方案1】:

你能告诉我更多关于这些功能的信息吗?

你想了解他们什么?在您找到它们的手册中对它们进行了非常清楚的描述。

它们有点类似于 Win32 的 LocalAllocLocalLock —— 你得到一个内存对象的句柄,但是要得到那个对象的可用地址需要一个额外的步骤。这些通常是一个坏主意,除非在内存极度受限的系统上。

他们还在 Glibc 中吗?

没有。

如果不是,为什么要删除它们?

因为它们通常是一个坏主意,并且会滋生难以发现的错误。

更新:

使用类似的东西可能会出现什么样的错误?

这是一个例子:

const char *my_strcat(const char *a, const char *b)
{
  const size_t len_a = strlen(a);
  const size_t len_b = strlen(b);
  char *handle;

  if (r_alloc((void**)&handle, len_a + len_b + 1) == NULL) return NULL;
  memcpy(handle, a, len_a);
  memcpy(handle + len_a, b, len_b + 1);

  return handle;
}

// There are memory leaks here. Ignore them for now.
int main()
{
  const char *result = my_strcat("abc", my_strcat("def", "ghi"));

  return strcmp(result, "abcdefghi");
}

你能发现错误吗?

程序有时会成功,有时会因非零退出代码而失败,有时会因SIGSEGV 而崩溃。

【讨论】:

  • 我尝试挖掘提及删除的更改日志条目,但我似乎找不到。您知道更改是在哪里宣布的吗?
  • @dfeuer 它们不是 glibc-2.0 原始导入的一部分。我猜他们是 glibc-1.x 的产物。
  • ¿你能解释一下为什么它们是个坏主意吗? ¿ 使用类似的东西可能会出现什么样的错误?提前谢谢你。
  • "你能发现错误吗?"除了不是以 NUL 结尾的结果字符串?标准malloc() 也可能出现该错误。 ;)
  • @AndrewHenle 该字符串正确地以 NUL 结尾。 那个错误不存在。
猜你喜欢
  • 2023-02-22
  • 2013-02-24
  • 2012-07-26
  • 2013-05-27
  • 1970-01-01
  • 2018-12-12
  • 2010-12-09
  • 2011-07-16
  • 2021-07-15
相关资源
最近更新 更多