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?
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
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) –
Vielen Dank. – Nick