Ответ 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
.