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

标签 c gnu glibc

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

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

最佳答案

Can you tell me more about that functions?

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

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

Are they still in Glibc?

没有。

If not, why they were removed?

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

更新:

What kind of bugs are possible by using something like that?

这是一个例子:

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 而崩溃。

关于c - 重定位分配器发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33034636/

相关文章:

c - GNU cpp 是否奇怪地为零参数的宏解释 C99 标准?

c - 如果 Realloc() 失败,调用者是否会丢失前一个 malloc() 调用中的数据?

c - 字符编码和类型-C/C++

c - 如何计算素数

linux - 如何配置 'less'显示格式化的markdown文件?

c++ - 关于 C++ 标准库的堆栈实现的快速问题

c - 为什么在启用 GCC 优化的情况下,这段代码使用 strlen 的速度要慢 6.5 倍?

c - 当我遇到套接字代码时,我正在仔细阅读 glibc,有人可以解释发生了什么吗?

气球排序的复杂性

java - 尝试通过管道将 C 中生成的数据传递给 Java 类。传递变量在java中显示为空白而不是有数据