Я думаю, что превосходный talloc
, разработанный как часть самбы, может быть тем, что вы ищете.Самая интересная часть в том, что любой указатель, возвращаемый из talloc, является допустимым контекстом памяти.Их пример:
struct foo *X = talloc(mem_ctx, struct foo);
X->name = talloc_strdup(X, "foo");
// ...
talloc_free(X); // frees memory for both X and X->name
В ответ на ваши конкретные моменты:
(1) Не уверен, что такое антифрагментация в этом случае.В C вы все равно не собираетесь сокращать сборку мусора, поэтому я думаю, что ваш выбор несколько ограничен.
(2) Он рекламирует только на 4% медленнее, чем обычный malloc(3)
, что довольно быстро.
(3) См. Пример выше.
(4) Это потокобезопасно, если разные потоки используют разные контексты, а лежащий в основе malloc является потокобезопасным.