我正在为C / C ++编写垃圾收集器作为编程练习,其中一部分涉及全局覆盖new
。但是,垃圾收集器也使用unordered_map
(存储指向已分配块的指针),如果地图尝试使用被覆盖的新对象,它会严重搞乱(我会尝试无限循环)。为了创建它,我想使用placement 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构造函数中进行segfault。我认为使用新的安置会解决问题,但显然不是。我很确定unordered_map在内部调用new。会给它一个分配器(我该怎么做?)解决这个问题?如果没有,这个问题是否可以解决?
答案 0 :(得分:2)
unordered_map
以及所有STL容器的完整声明包含allocator
作为最后一个参数:
template<class Key, class Ty, class Hash, class Pred, class Alloc>
class unordered_map;
这就是容器为其所有内部结构获取内存的地方。 您可能希望在此处实现自己的分配器。 Wikipedia看起来是一个很好的起点。