Я - новичок в 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;
}
Вопросы
malloc(1)
?release_pack_memory
делает и я не могу найти, что это функционирует реализация в целом исходном коде.#ifdef XMALLOC_POISON memset(ret, 0xA5, size);
?Я планирую снова использовать эту функцию на своем проекте. Это хорошая обертка вокруг malloc
?
Любая справка была бы большой.
malloc (0) не работает на всех платформах, и в этом случае вместо этого выполняется однобайтовое выделение. Разрешение выделения блоков памяти нулевой длины упрощает логику более высокого уровня программы.
Не знаю.
Заполняя выделенную память ненулевым значением, легче найти ошибки в программе, где память используется без надлежащей инициализации: в таких случаях программа почти сразу вылетает из строя. Поскольку заполнение памяти требует времени, она оборачивается определением препроцессора, поэтому компилируется только при желании.
Я не знаком с этой оболочкой, но вот что она делает
1 - если указан size = 0, то вместо этого выделяется 1 байт, если базовый malloc этого не делал
это, по-видимому, сделано для того, чтобы вызывающий мог по-прежнему свободно работать с ним (как realloc)
2 Я предполагаю, что он пытается заставить нижележащую подсистему памяти более тщательно искать память
3 XMALLOC_POISON заставляет буферизоваться до известного состояния это обычная практика для предотвращения и обнаружения нечетных ошибок, вызванных неинициализированными данными
Во-вторых - зачем вам оборачивать malloc. Начните с идеи того, что вы хотите сделать, а затем реализуйте это или скопируйте реализацию. Причины для обертывания malloc
Почти все это можно сделать с помощью valgrind - который делает гораздо больше .
Книга «написание твердого кода» имеет хороший набор оболочек памяти для 1,4 и 5
Для вопроса 2: release_pack_memory найден в sha1_file.c:570
Для вопроса 1:
Стандарт не определяет поведение malloc (0)
. Это может вернуть действительный указатель или может вернуть NULL. Различные реализации обрабатывают это по-разному, поэтому код возвращается к malloc (1)
, чтобы добиться согласованного поведения.
По вопросу 3:
Устанавливает содержимое буфера на что-то «странное». Таким образом, ваш код, надеюсь, не полагается на конкретное содержимое (что не гарантирует malloc).