2

我正在为 C/C++ 编写一个垃圾收集器作为编程练习,其中一部分涉及全局覆盖new. 但是,垃圾收集器也使用 an unordered_map(存储指向已分配块的指针),如果地图尝试使用覆盖的 new (我认为它会尝试无限循环),事情会变得严重混乱。为了创建它,我想使用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 构造函数中出现段错误。我认为使用placement new 可以解决问题,但显然不是。我很确定 unordered_map 在内部调用 new 。会给它一个分配器(我该怎么做?)解决这个问题?如果不是,这个问题可以解决吗?

4

1 回答 1

2

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

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

这就是容器为其所有内部结构获取内存的地方。您可能想在这里实现自己的分配器。维基百科看起来是一个很好的起点。

于 2010-12-17T04:40:36.223 回答