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

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

9 голосов
/ 19 марта 2010

Я новичок в C. Читая исходный код git, я нашел эту функцию-обертку около 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;
}

Вопросы * * 1005

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

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

Любая помощь будет отличной.

Ответы [ 4 ]

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

  2. Не знаю.

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

2 голосов
/ 19 марта 2010

Для вопроса 2: release_pack_memory находится в sha1_file.c: 570 .

2 голосов
/ 19 марта 2010

На вопрос 1:

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

На вопрос 3:

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

1 голос
/ 19 марта 2010

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

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

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

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

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

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

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

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

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

...