Gibt es eine Möglichkeit, die Größe des zuvor zugewiesenen Speichers auf einem Heap zu erhalten?
Zum Beispiel:
//pseudo-code
void* p = operator new (sizeof(int) * 3);
unsigned size = getSomeHow(p);
Gibt es eine Möglichkeit, die Größe des zuvor zugewiesenen Speichers auf einem Heap zu erhalten?
Zum Beispiel:
//pseudo-code
void* p = operator new (sizeof(int) * 3);
unsigned size = getSomeHow(p);
Sie können es nicht immer tun, da operator new()
kann auf jede vernünftige Art und Weise überladen werden, vielleicht sogar ohne Verwendung des Laufzeit-Heaps.
Für den Fall operator new()
wird implementiert mit malloc()
in Visual C++ können Sie verwenden _msize()
.
Obwohl Sharptooth mit seiner Antwort recht hat (new kann überlastet werden), könnte die Lösung genau in dieser Tatsache liegen. Durch Überladen von new können Sie leicht Ihre eigene Implementierung von new und delete hinzufügen. In Ihrer Implementierung von new sollten Sie:
Der Löschoperator sollte das Gegenteil bewirken:
Wenn Sie es auf diese Weise machen, stellen Sie sicher, dass Sie alle Varianten von new und delete implementieren (throwing und non-throwing, new und new[], delete und delete[], ...).
Seien Sie auch vorsichtig mit Bibliotheken von Drittanbietern. Sie setzen manchmal den Aufruf von new in ihren kompilierten Code in ihrer DLL, aber den Aufruf von delete in den Header. Dies bedeutet, dass new und delete unterschiedliche Implementierungen verwenden und Ihre Anwendung abstürzen wird.
EDIT:
Die Aufrundung auf ein Vielfaches von 8 Byte und die Addition von 8 Byte ist erforderlich, da die Daten an einer Adresse gespeichert werden sollten, die ein Vielfaches ihrer Größe ist:
Da Doubles der größte mir bekannte systemeigene Datentyp sind, runden wir auf ein Vielfaches von 8 Byte und fügen 8 Byte hinzu, um sicherzustellen, dass diese Anforderungen erfüllt werden.
new
Operator zum Aufruf malloc()
und speichern die Größe in einer globalen std::map<void*, size> alloc
.Dann ist das getSomeHow()
Funktion wird sich wie gewünscht verhalten:
getSomeHow(void *p){
return alloc[p];
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.