重定位分配器发生了什么?

Mab*_*bus 10 c gnu glibc

我读老的glibc的文档在这里时,我看到了,我以前从来没有(r_alloc,r_alloc_free和r_re_alloc)看到三个怪功能.他们实现了一个分配器,它可以为碎片整理目的重新分配内存,我想,但我无法在其他任何地方找到更多信息.

你能告诉我更多关于这些功能的信息吗?他们还在格里布吗?如果没有,为什么他们被删除?

Emp*_*ian 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");
}
Run Code Online (Sandbox Code Playgroud)

你能发现这个错误吗?

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