Wie lese ich die Array-Größe aus einem überbelegten Speicherblock?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie lese ich die Array-Größe aus einem überbelegten Speicherblock?

Post by Anonymous »

Ich versuche zu verstehen, woher delete[] arr die Größe von arr kennt. Und lesen Sie hier über Überzuteilung. Beim Testen

Code: Select all

char* a = new char[24];
char* b = new char;

printf("a = %p\n", a);
printf("b = %p\n", b);

size_t n = *(size_t*)(a-8);
printf("%zu\n", n);  // also tried different format specifier, output is always 33
Es zeigt, dass zusätzliche 8 Bytes zugewiesen wurden, aber der aus (a-WORDSIZE) gelesene Wert ergibt für mich keinen Sinn.

Code: Select all

a = 0x7d7c2c0
b = 0x7d7c2e0
33
Meine Frage ist also, wie kann ich die Anzahl der Elemente im Array/Speicherblock aus dem Zeiger lesen (wenn eine Überzuweisung verwendet wird)?
Bearbeiten:
Wie andere bereits betont haben, ist es nicht garantiert, dass sequentielle Speicherzuweisungen in sequentiellen Speicherblöcken platziert werden (und alle Speicherblöcke eine Mindestgröße haben), aber ich habe beim Erhöhen von a auf Größe 25 die Anzahl der Bytes zwischen beiden beobachtet char-Zeiger werden zu 48 und mit der Größe 41 wird die Differenz zu 64 und so weiter... .
Außerdem ist mir aufgefallen, dass n durchgängig der Differenz der Adressen +1 entspricht. Es scheint also, dass es der Speicherblockgröße entspricht, aber ich frage mich immer noch, warum Blockgröße + 1 und nicht die Anzahl der Elemente?
Und auch bei Verwendung eines nicht trivialen dekonstruierbaren Typs (Struktur mit einem Zeiger) beträgt die Differenz zwischen a und b immer 8 zusätzliche Bytes (oder 4 bei 32-Bit-Architektur).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post