Переопределение нового, но указание 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;
Вот где контейнер получает память для всех своих внутренних структур. Вы, вероятно, хотите реализовать свой собственный распределитель здесь. Википедия выглядит хорошей отправной точкой.