Обычно это наиболее очевидная причина для этого:
Обычно наиболее понятной причиной использования вашей собственной версии функций выделения памяти является наличие единственного определения, которое позволяет изменять распределитель памяти. для другого распределителя. (отладка, расширение или реализация с параметрами безопасности и т. д. c.)
Предположим, у вас есть следующая реализация:
void *my_malloc(size_t siz)
{
return malloc(siz);
}
void my_free(void *ptr)
{
free(ptr);
}
, определенная в allocator_malloc.c
и для специального клиента X вы приобрели лицензию нового распределителя ACME. Для этого клиента вы связываете свой исполняемый файл с файлом allocator_ACME.c
, который содержит:
void *my_malloc(size_t siz)
{
return ACME_malloc(siz);
}
void free(void *ptr)
{
ACME_free(ptr);
}
Затем, просто связывая свой исполняемый файл с тем или иным файлом, вы генерируете зависимость стандартной библиотеки malloc()
, или вам придется предоставить реализацию функции ACME_malloc()
. Таким образом, просто изменяя наличие одного из нескольких объектных файлов, изменяет весь набор зависимостей (при условии, что у вас есть определения для my_malloc()
и my_free()
в исходном файле) в одну из нескольких различных реализаций.
Недостатком является то, что у вас на один уровень больше вызовов функций, поэтому в некоторых случаях необходимо использовать более изощренное решение.
Предположим, что вы покупаете автоматический сборщик мусора c, поэтому не нужно возвращать память, выделенную с помощью mallo c, так как для некоторых magi c библиотека обнаружит, что вы ее больше не использовали, и мусор соберет ее автоматически:
void *my_malloc(size_t siz)
{
return GC_malloc(siz);
}
void my_free(void *ptr)
{
/* empty */
}