Wie würde man einen benutzerdefinierten MemoryManager erstellen, um einen bestimmten, zusammenhängenden Speicherbereich ohne die Hilfe anderer Speichermanager (wie Malloc/New) zu verwalten C++?Verwalten eines zusammenhängenden Chunks ohne Malloc/Neu oder Frei/Löschen
Hier einige weitere Kontext:
MemManager::MemManager(void* memory, unsigned char totalsize)
{
Memory = memory;
MemSize = totalsize;
}
Ich muss in der Lage, vergeben und frei bis Blöcke dieser zusammenhängenden Speicher einen MemManager verwenden. Der Konstruktor erhält die Gesamtgröße des Chunks in Bytes.
Eine Allocate-Funktion sollte die erforderliche Speichermenge in Byte aufnehmen und einen Zeiger auf den Anfang dieses Speicherblocks zurückgeben. Wenn kein Speicher mehr vorhanden ist, wird ein NULL-Zeiger zurückgegeben.
Eine Deallocate-Funktion sollte den Zeiger auf den Speicherblock aufnehmen, der freigegeben werden muss, und ihn zur späteren Verwendung an den MemManager zurückgeben.
Beachten Sie die folgenden Einschränkungen:
-Aside aus dem Teil des Speichers zu ihm gegeben, kann der MemManager nicht alle dynamischen Speicher verwendet
-wie ursprünglich angegeben, können die MemManager NICHT andere Speicher-Manager verwenden, um Führen Sie seine Funktionen, einschließlich new/malloc und löschen/frei
Ich habe diese Frage auf mehrere Vorstellungsgespräche bereits erhalten, aber auch Stunden der Online-Recherche hat mir nicht geholfen und ich habe jedes Mal versagt. Ich habe ähnliche Implementierungen gefunden, aber sie haben entweder malloc/new verwendet oder waren allgemeiner und angeforderter Speicher vom Betriebssystem, was ich nicht tun darf.
Beachten Sie, dass ich malloc/new und free/delete bequem bin und mit ihnen wenig Mühe habe.
Ich habe versucht, Implementierungen, die Knotenobjekte in einer LinkedList-Mode verwenden, die auf den Block des zugeordneten Speichers verweisen und angeben, wie viele Bytes verwendet wurden. Bei diesen Implementierungen war ich immer gezwungen, neue Knoten auf dem Stack zu erstellen und sie in die Liste einzufügen, aber sobald sie den Rahmen sprengten, brach das gesamte Programm, da die Adressen und Speichergrößen verloren gingen.
Wenn jemand irgendeine Idee hat, wie man so etwas implementiert, würde ich es sehr schätzen. Danke im Voraus!
BEARBEITEN: Ich habe vergessen, dies direkt in meinem ursprünglichen Beitrag anzugeben, aber die mit diesem MemManager zugewiesenen Objekte können unterschiedliche Größen haben.
BEARBEITEN 2: Am Ende habe ich homogene Speicherblöcke verwendet, was dank der Informationen in den Antworten sehr einfach zu implementieren war. Die genauen Regeln bezüglich der Implementierung selbst wurden nicht angegeben, daher habe ich jeden Block in 8 Bytes aufgeteilt. Wenn der Benutzer mehr als 8 Bytes angefordert hat, konnte ich es nicht geben, aber wenn der Benutzer weniger als 8 Bytes anforderte (aber> 0), würde ich zusätzlichen Speicher geben. Wenn die übergebene Speichermenge nicht durch 8 teilbar wäre, gäbe es am Ende verschwendeten Speicher, was viel besser ist, als mehr Speicher zu verwenden, als Sie bekommen.
Der Trick besteht darin, Metadaten etwas unterhalb der zugewiesenen Adresse zu speichern. Zu müde, um jetzt eine vollständige Erklärung zu schreiben. – Jason