重定位分配器出了什么问题?

10

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

你能告诉我更多关于这些函数的信息吗?它们是否仍然存在于Glibc中?如果不再使用,为什么会被删除?


通常来说,未记录的函数是供“内部”使用的。即使它们尚未被删除,它们在任何未来版本中都可能被删除、重命名或更改,因为glibc的内部设计正在不断发展。 - MSalters
1
@MSalters 这些函数既不是内部函数,也不是未记录的函数:问题是关于(旧)文档中发现的函数。 - Employed Russian
如果你想要复制或压缩垃圾回收,C 可能不是适合你的语言。 - dfeuer
1个回答

2
你能告诉我更多关于这些函数的信息吗?
你想知道它们的什么信息?在手册中已经很清楚地描述了它们。它们有点类似于Win32的LocalAlloc和LocalLock——你可以得到一个内存对象的句柄,但要获取该对象可用地址需要额外的步骤。除非在极度内存受限的系统上,否则通常不建议使用它们。
它们还在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
你能发现这个错误吗?除了没有在结果字符串中添加NUL终止符之外?即使使用标准的malloc(),也可能出现这种错误。 ;) - Andrew Henle
我看到的问题是句柄在堆栈中。在这种情况下,这并不重要:因为您没有调用任何分配函数,指针不能移动。但在更复杂的情况下,它可能会导致灾难。然而,我认为通过仔细编程,您可以避免问题,就像在普通的C代码中一样。但我不确定碎片整理在现代PC中是否仍然是一个问题,所以我暂时不会尝试使用类似的东西 :-)。 - Mabus
好的,我没有看到有两个调用。但是我看到的错误是相同的:由于句柄在堆栈中,如果内存移动,指针会更新并且堆栈中的该位置将被覆盖,可能会导致一些损坏。我说得对吗? - Mabus
@Mabus 不,句柄在堆栈上并不是问题。你仍然没有找到错误的事实应该作为一个很好的例子,说明为什么“r_alloc”很难正确使用;-) - Employed Russian
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接