2010-12-17 65 views
2

我正在爲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在內部調用新的。將給它一個分配器(我怎麼做?)解決這個問題?如果不是,這個問題是否可以解決?

回答

2

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

相關問題