In einer typischen Implementierung ist die Größe des dynamischen Speicherblocks irgendwie im Block selbst gespeichert - das ist richtig. Aber es gibt keinen Standardweg, um auf diese Informationen zuzugreifen. (Implementierungen können implementierungsspezifische Möglichkeiten bieten, um darauf zuzugreifen). So ist es mit malloc/free
, so ist es mit new[]/delete[]
.
In der Tat, in einer typischen Implementierung roher Speicherzuordnungen für new[]/delete[]
Anrufe werden schließlich durch ein implementierungsspezifische malloc/free
-ähnlichen Paare verarbeitet werden, was bedeutet, dass delete[]
nicht wirklich kümmern hat, wie vielen Speicher freizugeben: es einfach ruft das interne free
(oder wie auch immer es heißt), das kümmert sich darum.
Was delete[]
muss allerdings wissen, ist, wie viele Elemente Destruct in Situationen, in denen Array Elementtyp nicht-trivial destructor hat. Und das ist, worum geht es bei Ihrer Frage - die Anzahl der Array-Elemente, nicht die Größe des Blocks (diese beiden sind nicht gleich, der Block könnte größer sein als wirklich für das Array selbst erforderlich). Aus diesem Grund wird die Anzahl der Elemente in dem Array normalerweise auch innerhalb des Blocks durch new[]
gespeichert und später durch delete[]
abgerufen, um die richtige Arrayelementzerstörung durchzuführen. Es gibt auch keine Standardmethoden, um auf diese Nummer zuzugreifen.
(Dies bedeutet, dass im allgemeinen Fall ein typischer Speicherblock durch new[]
zugeordnet unabhängig wird, gleichzeitig speichern sowohl die physikalische Blockgrße in Bytes und die Array-Elemente Zahl. Diese Werte, die durch verschiedene Ebene der C gespeichert sind ++ Speicherzuweisungsmechanismus - Raw Memory Allocator und new[]
selbst - und interagieren nicht in irgendeiner Weise miteinander.
Beachten Sie jedoch, dass die Anzahl der Array-Elemente aus den oben genannten Gründen normalerweise nur dann gespeichert wird, wenn der Array-Elementtyp einen nicht-trivialen Destruktor aufweist. I.e. Diese Anzahl ist nicht immer vorhanden. Dies ist einer der Gründe, warum es nicht machbar ist, eine Standardmethode für den Zugriff auf diese Daten bereitzustellen: Sie müssen sie entweder immer speichern (was Speicher verschwendet) oder ihre Verfügbarkeit nach Destruktor-Typ einschränken (was verwirrend ist).
die oben Zur Veranschaulichung, wenn Sie eine Reihe von int
s
int *array = new int[100];
der Größe des Arrays (dh 100
) erstellen, ist nicht normalerweise durch new[]
da delete[]
gespeichert überhaupt nicht darum kümmern (int
hat keinen Destruktor). Die physische Größe des Blocks in Bytes (wie 400 Bytes oder mehr) wird normalerweise in dem Block durch den Rohspeicherzuordner gespeichert (und von dem durch delete[]
aufgerufenen Raw-Speicherfreigabeverteiler verwendet), aber für einige kann er leicht 420 sein implementierungsspezifischer Grund. Daher ist diese Größe für Sie im Grunde genommen nutzlos, da Sie nicht die genaue ursprüngliche Array-Größe daraus ableiten können.
Ein einfaches, gutes Design muss es nicht wissen - in einem komplexen Fall muss man viel selbst verwalten. Es gibt im Allgemeinen Debug-Funktionen für Ihren Compiler, die Ihnen sagen werden - aber wenn Sie das brauchen, ist Ihr Design wahrscheinlich falsch. –
Ich habe mich oft gewundert, warum Sie nie einen Zuordner sehen, der die Größe nicht kennt und verlangt, dass er beim Löschen weitergegeben wird. Denn wie oft sind Sie jemals gekommen, um einen Speicherblock zu löschen und nicht in der Lage, seine Größe zu berechnen? Ich denke, es hätte nie wirklich einen Vorteil für die Implementierung eines Systems mit dieser Einschränkung geben können ... – matt
Es würde wahrscheinlich unnötige Einschränkungen bei der Implementierung einer solchen Low-Level-Operation geben. Nach allem, was Sie wissen, wie viel Sie gefragt haben, wenn Sie das Array zugewiesen, so gibt es keine dringende Notwendigkeit der Laufzeit, um Ihnen das sagen zu können. – UncleBens