Memory Manager - Ideen?
-
Hi! Ich arbeite gerade an einem Projekt, in dem ich sehr oft Speicher selbst allokieren und wieder freigeben muss.
Die Speicherblöcke werden teilweise in Arrays, teilweise in Structs, teilweise in Arrays voll structs die Arrays haben usw... gespeichert
So ungefähr:
class Obj { vector<double>* ptr_to_vec; AStruct* st; }; struct AStruct { vector<string>* ptr_to_str; };Kurzum, am ende habe ich alle Speicherobjekte irgendwie untergebracht, und zwar so dass alle im endeffekt über eine art "Destruktorkette" alle gelöscht werden.
So, mein Problem ist folgendes:
Es kann passieren, dass diese sequenz unterbrochen wird, und die "Destruktorkette" eine lücke aufweist, das beudeutet dann ein Speicherleck.Bis jetzt habe ich es so geregelt, dass jeder Typ, der dynamisch allokiert wird, eine eigene Templateinstanz einer Klasse hat, die sich alle allokierten Zeiger merkt und bei Störungen alle darin enthaltenen zeiger löscht.
so ungefähr:
template <typename T> class memory_manager { static std::vector<T*> currently_registered; public: // Neuen zeiger registrieren static T* register_new(T* ptr); // Zeiger wieder "entregistrieren" static T* unregister(T* ptr); // alle registrierten Loescchen static void delete_all(); }; //Verwendung double* a_pointer = memory_manager<double> register_new( new double ); // entregistrieren memory_manager<double>::unregister(a_pointer); // alle loeschen memory_manager<double>::delete_all();Die Nachteile bei meiner Variante sind folgendes:
Ich muss jeden Zeiger nach dem allokieren sozusagen "Registrieren", und zwar bei dieser Templateinstanz. (Dadurch wird das Template automatisch für diesen Typ instanzieert). Wenn ich den Zeiger dann in die "Sichere Zone" übergebe, muss ich ihn wieder "Entregistrieren". Das ist ziemlich unbequem, denn nichts hindert mich daran eines der beiden zu vergessen.
Zweitens muss ich mir merken, welche typen ich alle Instanzieert habe, um dann alle explizit von hand selbst zu löschen. Das ist wieder ziemlich unbequem, weil ich da wieder ganz leicht etwas vergessen kann.So, nun wollte ich mal fragen ob ihr schon mal so ne art "Memory Manager" geschrieben habt, und wie das design dazu aussieht, oder ob ihr an meiner Version etwas zu verbessern habt.
Also, ich hoffe ihr könnt mir da ein bisschen weiterhelfen.
mfg, DrPhil_Guth
-
Um konkrete Vorschläge zu machen, musst du erstmal konkreter werden: Was hast du für Ansprüche an den Memory-Manager? Liegt das Augenmerk auf Schnelligkeit, möglichst wenig Fragmentation, soll er die Garbage-Collection übernehmen oder was erwartest du von ihm?
-
-
Wieso hantierst du überhaupt soviel mit Zeigern rum? Ich brauche sowas nicht SO oft. Vielleicht könntest du mal ein wenig Code herzeigen (1:1 aus deinem Projekt, eine Stelle die verständlich macht warum du so viel Speicher "mit Hand" anforderst und freigibst).
-
Guck dir boost::shared_ptr<> an, das könnte man als eine Art "Memory Manager" bezeichnen. Ist viel einfacher zu verwenden als das was du gebastelt hast. Alternativ guck dir auch boost::intrusive_ptr<> an.
-
-
-
Ich denke boost::pool oder Poco::MemoryPool könnte was für Dich sein