2016-07-30 46 views
2

ich Bediener außer Kraft setzen wollen new diese Signatur zu haben:Operator new mehr Speicher Rückkehr als gebeten,

void* operator new(size_t bytes, MemoryManager* man); 

Und die Klasse MemoryManager wie folgt aussieht:

struct MemoryManager 
{ 
    virtual void* Allocate(size_t bytes) = 0; 
    virtual void Deallocate(void* ptr) = 0; 
}; 

Nun, was ich tun möchte, ist die überladene new Funktion zuweisen mehr Speicher als gefragt, zu tun. Und dann in den letzten paar Bytes wird es einen Zeiger auf das Objekt speichern, so dass es weiß, welche Funktion in meinem benutzerdefinierten Operator delete zu verwenden. So würde es so etwas aussehen aussehen:

__________ 
|   | _ 
|__________| | 
|   | | 
|__________| | 
|   | | <---- Bytes requested for object 
|__________| | 
|   | | 
|__________| | 
|   | _| 
|__________| 
|   | _ 
|__________| | <---- Pointer to MemoryManager 
|   | _| 
|__________| 

Jetzt ist meine eigentliche Frage: führt dies zu undefiniertem Verhalten? Einige Dinge, die ein Problem sein könnte:

  • Es könnte undefiniert für new mehr Bytes zurück als
  • angefordert
  • Sie könnten in Ausrichtung Probleme laufen (aber die wahrscheinlich überwunden werden könnten)
+5

Mir ist nichts bekannt, was 'new char [10]' daran hindert, 100 Megabyte Speicher zurückzugeben. So etwas wäre natürlich nicht sehr nützlich. Aber nichts in C++ verbietet es, AFAIK. –

+3

Traditionell machen Sie dies, indem Sie die zusätzlichen Daten * vor * dem Objekt speichern, da Sie bei der Zerstörung keine Größe erhalten. Und ist eine übliche Technik. Weisen Sie X zusätzliche Bytes zu, schreiben Sie Daten in die ersten X Bytes und geben Sie dann X Bytes in den Puffer zurück. – Yakk

Antwort

9

Diese so etwas ist ziemlich üblich. Normalerweise würden Sie die zusätzlichen Daten jedoch lieber am Anfang als am Ende speichern (achten Sie dabei auf die maximale Ausrichtung Ihrer Plattform, d. H. Sie müssen möglicherweise auffüllen). Es gibt nichts in der Sprache, das das verbietet, was Sie vorschlagen.

4

Von [basic.stc.dynamic.allocation]:

Die Zuordnungsfunktion versucht, die angeforderte Menge an Speicherplatz zuzuweisen. Wenn es erfolgreich ist, soll es die Adresse des Beginns eines Speicherblocks zurückgeben, dessen Länge in Bytes mindestens so groß wie die angeforderte Größe sein soll.

Hervorhebung hinzugefügt. Also ja, der Standard erlaubt einem gültigen Speicherbereich, mehr Platz zu haben, als strikt angefordert wurde.