Anzahl der Elemente von Array auf dem Heap?
-
Danke für deine Antwort! Ich habe mir sowas schon gedacht. Der Prof ist zu blöd vernünftige Aufgaben zu stellen. Das wird wieder mehr Fragestunde als Klausur werden...
thx!
Nils
-
Wie funktioniert dann eigentlich sowas:
class foo { static int count; std::string str; public: foo() { char buf[10]; itoa( count, buf, 10 ); str = std::string( buf ); std::cout << str; count++; } ~foo() { std::cout << str; count --; } }; int foo::count = 0; int main( int argc, char* argv[]) { foo *a = new foo[10]; delete[] a; return 0; } //Ausgabe: 01234567899876543210
delete[] muss ja irgendwoher wissen wieviele Elemente es löschen muss?
-
rean schrieb:
Wie funktioniert dann eigentlich sowas: [...]
Was soll der Code mit der ursprünglichen Frage zu tun haben? Ich seh' da kein "Array auf dem Heap"...
rean schrieb:
delete[] muss ja irgendwoher wissen wieviele Elemente es löschen muss?
Das der Programmierer es nicht aus dem Zeiger alleine ableiten kann heißt nicht, das es die Speicherverwaltung des Betriebssystems nicht weiß.
cheers, Swordfish
-
Bitte meinen Beitrag nochmals lesen.
Und es gibt für den Programmierer keine Möglichkeit dass mit Mitteln des Betriebssystems rauszubekommen?
-
Swordfish schrieb:
Ich seh' da kein "Array auf dem Heap"
rean schrieb:
foo *a = new foo[10];
rean schrieb:
delete[] muss ja irgendwoher wissen wieviele Elemente es löschen muss?
Normalerweise wird beim Aufruf von new noch ein kleiner Speicherbereich reseviert, wo gespeichert wird, wieviel groß der angeforderte Block ist. delete weiß dann wo sich dieser Bereich befindet, um die Größe des zu löschenden Bereichs zu ermitteln.
-
rean schrieb:
Bitte meinen Beitrag nochmals lesen.
Und es gibt für den Programmierer keine Möglichkeit dass mit Mitteln des Betriebssystems rauszubekommen?
Es gibt keine Möglichkeit über Standardmittel. Was Systemspezifisch angeboten wird ist wieder eine andere Sache. Für Windows gibts z.B. die Funktion _msize().
-
David_pb schrieb:
Es gibt keine Möglichkeit über Standardmittel. Was Systemspezifisch angeboten wird ist wieder eine andere Sache. Für Windows gibts z.B. die Funktion _msize().
(@OP) Beachte aber hierbei, dass Du nicht nur die Portabilität verlierst, sondern Dir auch derbe Probleme einhandelst, wenn Du der Funktion nicht genau das übergibst, was sie erwartet.
void f(int* array) { size_t array_len = whatever_nonportable_function(array); fwrite(array, sizeof(int), array_len, stream); } int* x = new int[100]; f(x); // ok int y[100]; f(y); // ?!? int* z = new int[100]; f(&z[50]); // ?!?
-
KasF schrieb:
Swordfish schrieb:
Ich seh' da kein "Array auf dem Heap"
rean schrieb:
foo *a = new foo[10];
rean schrieb:
Zuletzt bearbeitet von rean am 13:00:06 21.07.2008, insgesamt 1-mal bearbeitet
...
cheers, Swordfish
-
Uups, sorry.
-
Und es gibt für den Programmierer keine Möglichkeit dass mit Mitteln des Betriebssystems rauszubekommen?
Nope. Du musst auch unterscheiden zwischen der Grösse des Blocks der vom OS angefordert wurde, der Allokationsgrösse auf dem "C++ Heap" (was auch immer die Implementierung verwendet), und der Anzahl an Elementen * sizeof(T).
Kann alles unterschiedlich sein.z.B. kann die Implementierung immer min. 1MB grosse Stücke vom OS holen, dann is der Wert schonmal für die Wirscht. Die Implementierung kann auch Blockgrössen aufrunden. Du willst z.B. Speicher für 9 chars, die Implementierung sagt 9 wird auf z.B. 12 aufgerundet und holt ein 12 Byte Stück irgendwoher.
Die Anzahl der Elemente ist als 9, das Stück welches die Implementierung verwendet 12 Byte, und das was vom OS geholt wurde gleich 1MB oder so. Also Pustekuchen.Für eine Implementierung die man genau kennt kann man u.u tricksen, aber das kann dann u.u. mit der nächsten Version des Compilers/der Library/... brechen.
Kurz: lass es einfach.
-
hmm.. wieso ist der vorschlag mit dem vector noch net gekommen....vll. ist dem OP nich klar das es sowas gibt^^