Переопределение нового, но указание unordered_map не использовать его

Я пишу сборщик мусора для C/C++ как упражнение по программированию, и часть этого включает глобальное переопределение new, Однако сборщик мусора также использует unordered_map (для хранения указателей на выделенные блоки), и все будет серьезно испорчено, если карта попытается использовать переопределенную новую (я думаю, она будет пытаться бесконечно зацикливаться). Чтобы создать его, я хотел использовать размещение new, чтобы избежать вызова переопределенного new:

void *buffer = malloc(sizeof(unordered_map<void *, mem_t *>));
unordered_map<void *, mem_t *> map = new(buffer) unordered_map<void *, mem_t *>();

(mem_t - это структура, которую я определил, но я не думаю, что это уместно.) При запуске этот код вызывает ошибки в конструкторе unordered_map. Я думал, что использование размещения new решило бы проблему, но, видимо, нет. Я почти уверен, что unordered_map вызывает новый внутренний вызов. Поможет ли это дать распределитель (как мне это сделать?)? Если нет, можно ли решить эту проблему?

1 ответ

Решение

Полная декларация unordered_map Как и все контейнеры STL, включает в себя allocator как последний параметр:

template<class Key, class Ty, class Hash, class Pred, class Alloc>
    class unordered_map;

Вот где контейнер получает память для всех своих внутренних структур. Вы, вероятно, хотите реализовать свой собственный распределитель здесь. Википедия выглядит хорошей отправной точкой.

Другие вопросы по тегам