Verfügbare Informationen zu "Memory Manager - Ideen?"
Qualität des Beitrags: Beteiligte Poster: DrPhil_Guth - Xin Forum: Tutorials.at Forenbeschreibung: Programmierforum aus dem Unterforum: C / C++ Antworten: 2 Forum gestartet am: Mittwoch 19.04.2006 Sprache: deutsch Link zum Originaltopic: Memory Manager - Ideen? Letzte Antwort: vor 14 Jahren, 10 Monaten, 26 Tagen, 12 Stunden, 15 Minuten
Alle Beiträge und Antworten zu "Memory Manager - Ideen?"
Re: Memory Manager - Ideen?
DrPhil_Guth - 28.04.2008, 19:45Memory 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:
Code: 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:
Code: 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
Re: Memory Manager - Ideen?
Xin - 29.04.2008, 20:34Re: Memory Manager - Ideen?
DrPhil_Guth hat folgendes geschrieben: Hi! Ich arbeite gerade an einem Projekt, in dem ich sehr oft Speicher selbst allokieren und wieder freigeben muss.
Schau Dich mal um, "operator new()" zu überladen und Dir einen Memory-Pool anzulegen. Da Du offenbar vorrangig Objekte gleicher Größe hast, kannst Du das Verhalten deutlich optimierien. Entsprechend delete überladen.
http://sascha.atrops.com/?page=knowhow/opoverload/memory.php
DrPhil_Guth hat folgendes geschrieben: 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.
Warum kann das passiert?
Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken
Weitere Beiträge aus dem Forum Tutorials.at
Endlosschleife unterbrechen??? - gepostet von gs93 am Dienstag 17.10.2006
Was haltet ihr von FreeBasic? - gepostet von ggspp am Samstag 13.01.2007
Serielle Schnittstelle ansteuern (C) - gepostet von mitti am Sonntag 03.06.2007
Knifflige fehler im kleinem programm - gepostet von aimheld am Samstag 23.09.2006
zwei Funktion gleichteitig - gepostet von Elch am Montag 20.08.2007
Demo Version machen ----> Wie? - gepostet von vpascal am Freitag 04.05.2007
EXE-Dateien in Visual Pascal??? - gepostet von Robin21 am Sonntag 25.06.2006
Programm (C) was Sekunden in Tage Stunden Minuten umrechnet! - gepostet von Kimi am Donnerstag 01.11.2007
Ähnliche Beiträge wie "Memory Manager - Ideen?"
JENS -- ER IST ES !!!!! - Steph (Mittwoch 18.01.2006)
Jens und Sabine - pilotin (Samstag 21.04.2007)
Soll Jens Foto drinbleiben? - Der_Chris (Dienstag 18.04.2006)
Verzögerung um 3 stunden! - Alpujarra (Samstag 17.05.2008)
Happy Birthday Jens! - -=Fr4nZ!=- (Donnerstag 20.09.2007)
Jens Kreative Ader XD - Jen (Mittwoch 07.11.2007)
Jens Hagg - Kaiserin Sandra (Samstag 03.06.2006)
Der Jens im Tor!!! - Tequila (Montag 24.09.2007)
Jens Pulver HL - Nixon (Mittwoch 21.02.2007)
Jens und Sabine-ein Traumpaar? - pilotin (Mittwoch 18.04.2007)
