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

问题描述:

我正在为C/C++编写一个垃圾回收器作为编程练习,其中一部分涉及全局重写new。但是,垃圾收集器也使用unordered_map(用于存储指向已分配块的指针),如果地图尝试使用重写的新建(它将尝试无限循环,我认为),则事情将严重混乱。要创建它,我想用安置新来避免调用重写新:覆盖新的但告诉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构造函数中。我认为使用安置新会解决问题,但显然不是。我很确定unordered_map在内部调用新的。将给它一个分配器(我怎么做?)解决这个问题?如果不是,这个问题是否可以解决?

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

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

这就是一个容器获取存储器,用于其所有的内部结构。 你可能想在这里实现你自己的分配器。 Wikipedia看起来是一个很好的起点。

+0

因此,我需要创建一个类并实现本页底部列出的所有8种方法( http://www.cplusplus.com/reference/std/memory/allocator/),然后呢?我想要的只是它直接使用malloc(和免费),而无需先通过新的(和删除)。 – Nick 2010-12-17 04:53:23

+0

是的。或者看看你是否可以重用你的编译器 - 比如GCC提供了一堆特殊的分配器(它们都在我的mac上的'/ usr/include/C++/4.2.1/ext'下) – 2010-12-17 04:58:32

+0

非常感谢。 – Nick 2010-12-17 05:19:53