Переопределение нового, но указание unordered_map не использовать его - PullRequest
2 голосов
/ 17 декабря 2010

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

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 Ответ

2 голосов
/ 17 декабря 2010

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

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

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

...