3 Stimmen

Ermitteln der Größe eines reservierten Speichers auf dem Heap

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);

8voto

sharptooth Punkte 162790

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

5voto

Patrick Punkte 22569

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:

  • EDIT: Rundung der Größe auf das nächste Vielfache von 8 Byte
  • 8 Bytes zu der von der Anwendung angeforderten Größe hinzufügen
  • Aufruf der Speicherzuweisungsroutine des Systems (z. B. HeapAlloc in Windows)
  • die ursprünglich angeforderte Größe in die ersten 8 Bytes einzutragen
  • zum zurückgegebenen Zeiger 8 addieren und diesen an die Anwendung zurückgeben

Der Löschoperator sollte das Gegenteil bewirken:

  • Subtraktion von 8 Bytes von dem von der Anwendung angegebenen Zeiger
  • Aufruf der Routine zum Freigeben des Systemspeichers

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:

  • Zeichen können nicht mehr gespeichert werden
  • Kurzschlüsse müssen auf einer geraden Adresse gespeichert werden
  • Longs müssen an einer Adresse gespeichert werden, die ein Vielfaches von 4 ist
  • Doubles müssen an einer Adresse gespeichert werden, die ein Vielfaches von 8 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.

1voto

Ben Punkte 6884
  • Sie können die 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]; 
}
  • Sie können auch Ihr eigenes malloc() schreiben und den Lader so einstellen, dass er Ihr malloc anstelle des Standardmallocs verwendet. Ich habe dies zum Zweck der Nachverfolgung getan, es funktioniert gut.

CodeJaeger.com

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.

Powered by:

X