В C просто для библиотеки просто позволить пользователю настраивать выделение памяти с помощью глобальных указателей функций на функцию, которая должна вести себя аналогично malloc()
и функции, которая должна вести себя аналогично free()
. SQLite, например, использует этот подход.
С++ усложняет ситуацию, потому что распределение и инициализация обычно сливаются. По сути, мы хотим получить поведение переопределенных operator new
и operator delete
только для библиотеки, но нет способа сделать это (я достаточно уверен, но не совсем на 100%).
Как это сделать в С++?
Здесь первый удар по чему-то, что реплицирует некоторую семантику выражений new
с помощью функции Lib::make<T>
.
Я не знаю, насколько это полезно, но просто для удовольствия, здесь более сложная версия, которая также пытается реплицировать семантику выражений new[]
.
Это целевой вопрос, поэтому я не обязательно ищу проверку кода. Если есть лучший способ сделать это, просто скажите это и проигнорируйте ссылки.
( "распределителем" я имею в виду только то, что выделяет память. Я не имею в виду концепцию распределителя STL или даже обязательно выделяю память для контейнеров.)
Почему это может быть желательно:
Здесь сообщение в блоге от разработчика Mozilla, в котором утверждается, что библиотеки должны это делать. Он дает несколько примеров библиотек C, которые позволяют пользователю библиотеки настраивать распределение для библиотеки. Я проверил исходный код для одного из примеров SQLite и увидел, что эта функция также используется внутри для тестирования с помощью впрыска. Я не пишу ничего, что должно быть как пуленепробиваемое, как SQLite, но оно все же кажется разумной идеей. Если ничего другого, он позволяет коду клиента определить: "Какая библиотека забивает мою память и когда?".