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)
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. –
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