覆盖新的但告诉unordered_map不要使用它

时间:2010-12-17 04:28:07

标签: c++ unordered-map new-operator allocator placement-new

我正在为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。会给它一个分配器(我该怎么做?)解决这个问题?如果没有,这个问题是否可以解决?

1 个答案:

答案 0 :(得分:2)

unordered_map以及所有STL容器的完整声明包含allocator作为最后一个参数:

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

这就是容器为其所有内部结构获取内存的地方。 您可能希望在此处实现自己的分配器。 Wikipedia看起来是一个很好的起点。