Обертывание malloc - C

Я - новичок в C. При чтении исходного кода мерзавца я нашел эту функцию обертки вокруг malloc.

void *xmalloc(size_t size)
{
    void *ret = malloc(size);
    if (!ret && !size)
        ret = malloc(1);
    if (!ret) {
        release_pack_memory(size, -1);
        ret = malloc(size);
        if (!ret && !size)
            ret = malloc(1);
        if (!ret)
            die("Out of memory, malloc failed");
    }
#ifdef XMALLOC_POISON
    memset(ret, 0xA5, size);
#endif
    return ret;
}

Вопросы

  1. Я не мог понять, почему они используют malloc(1)?
  2. Что делает release_pack_memory делает и я не могу найти, что это функционирует реализация в целом исходном коде.
  3. Что делает #ifdef XMALLOC_POISON memset(ret, 0xA5, size); ?

Я планирую снова использовать эту функцию на своем проекте. Это хорошая обертка вокруг malloc?

Любая справка была бы большой.

9
задан Navaneeth K N 19 March 2010 в 18:29
поделиться

4 ответа

  1. malloc (0) не работает на всех платформах, и в этом случае вместо этого выполняется однобайтовое выделение. Разрешение выделения блоков памяти нулевой длины упрощает логику более высокого уровня программы.

  2. Не знаю.

  3. Заполняя выделенную память ненулевым значением, легче найти ошибки в программе, где память используется без надлежащей инициализации: в таких случаях программа почти сразу вылетает из строя. Поскольку заполнение памяти требует времени, она оборачивается определением препроцессора, поэтому компилируется только при желании.

3
ответ дан 4 December 2019 в 22:28
поделиться

Я не знаком с этой оболочкой, но вот что она делает

1 - если указан size = 0, то вместо этого выделяется 1 байт, если базовый malloc этого не делал

это, по-видимому, сделано для того, чтобы вызывающий мог по-прежнему свободно работать с ним (как realloc)

2 Я предполагаю, что он пытается заставить нижележащую подсистему памяти более тщательно искать память

3 XMALLOC_POISON заставляет буферизоваться до известного состояния это обычная практика для предотвращения и обнаружения нечетных ошибок, вызванных неинициализированными данными

Во-вторых - зачем вам оборачивать malloc. Начните с идеи того, что вы хотите сделать, а затем реализуйте это или скопируйте реализацию. Причины для обертывания malloc

  1. обнаружения утечек
  2. анализа использования
  3. пула памяти
  4. отладки (например, XMALLOC_POISON)
  5. принудительной проверки

Почти все это можно сделать с помощью valgrind - который делает гораздо больше .

Книга «написание твердого кода» имеет хороший набор оболочек памяти для 1,4 и 5

1
ответ дан 4 December 2019 в 22:28
поделиться

Для вопроса 2: release_pack_memory найден в sha1_file.c:570

2
ответ дан 4 December 2019 в 22:28
поделиться

Для вопроса 1:

Стандарт не определяет поведение malloc (0) . Это может вернуть действительный указатель или может вернуть NULL. Различные реализации обрабатывают это по-разному, поэтому код возвращается к malloc (1) , чтобы добиться согласованного поведения.

По вопросу 3:

Устанавливает содержимое буфера на что-то «странное». Таким образом, ваш код, надеюсь, не полагается на конкретное содержимое (что не гарантирует malloc).

2
ответ дан 4 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: