2010-12-17 4 views
2

Ich schreibe einen Garbage Collector für C/C++ als Programmierübung, und ein Teil davon umfasst global überschreiben new. Allerdings verwendet der Garbage Collector auch einen unordered_map (um Zeiger auf zugewiesene Blöcke zu speichern), und Dinge werden ernsthaft durcheinander gebracht, wenn die Karte versucht, das überschriebene neue zu verwenden (es wird versuchen, endlos zu loopen, denke ich). So erstellen Sie es, ich wollte Platzierung nutzen, um neue zu vermeiden, die überschriebene Aufruf neu:Overriding neu, aber unordered_map zu sagen, es nicht zu verwenden

void *buffer = malloc(sizeof(unordered_map<void *, mem_t *>)); 
unordered_map<void *, mem_t *> map = new(buffer) unordered_map<void *, mem_t *>(); 

(mem_t ist eine Struktur I definiert haben, aber ich glaube nicht, das ist relevant.) Bei der Ausführung dieser Code segfaults im Konstruktor unordered_map. Ich dachte, mit Placement new hätte das Problem behoben, aber anscheinend nicht. Ich bin mir ziemlich sicher, dass unordered_map intern neu aufruft. Wird es ein Allokator geben (wie mache ich das?), Um dieses Problem zu beheben? Wenn nicht, ist dieses Problem reparierbar?

Antwort

2

Die vollständige Erklärung von unordered_map sowie alle STL-Container enthält allocator als letzten Parameter:

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

Das ist, wo ein Container-Speicher für alle seine internen Strukturen bekommt. Wahrscheinlich möchten Sie hier Ihren eigenen Allokator implementieren. Wikipedia sieht wie ein guter Ausgangspunkt aus.

+0

Also müsste ich eine Klasse erstellen und alle 8 Methoden implementieren, die am Ende dieser Seite aufgeführt sind ( http://www.cplusplus.com/reference/std/memory/allocator/) dann? Alles, was ich will ist, dass es direkt malloc (und kostenlos) verwendet, ohne zuerst durch (und löschen) zu gehen. – Nick

+0

Ja. Oder sehen Sie, ob Sie wiederverwenden können, was Ihr Compiler hat - sagen wir, GCC bietet eine Menge spezieller Allokatoren (sie sind alle unter '/ usr/include/C++/4.2.1/ext' auf meinem Mac) –

+0

Vielen Dank. – Nick