Подтвердить что ты не робот

Что случилось с распределителем-распределителем?

Я читал старую документацию glibc здесь, когда увидел три странные функции, которые я никогда раньше не видел (r_alloc, r_alloc_free и r_re_alloc). По-моему, они реализовали распределитель, который, по-моему, реализует память для дефрагментации, но я не могу найти больше информации нигде.

Можете ли вы рассказать мне больше об этих функциях? Они все еще в Glibc? Если нет, то почему они были удалены?

4b9b3361

Ответ 1

Можете ли вы рассказать мне больше об этих функциях?

Что вы хотите знать о них? Они довольно четко описаны в руководстве, в котором вы их нашли.

Они несколько похожи на Win32 LocalAlloc и LocalLock - вы получаете дескриптор объекта памяти, но для получения полезного адреса этого объекта требуется дополнительный шаг. Как правило, это плохая идея, за исключением систем с ограниченной памятью.

Они все еще находятся в Glibc?

Нет.

Если нет, то почему они были удалены?

Потому что они, как правило, плохая идея и порождают труднодоступные ошибки.

Update:

Какие ошибки можно использовать, используя что-то подобное?

Вот пример:

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.