Array von Strukturen dynamisch
-
Was macht die folgende Zeile:
IrgendeinStrukt* S = new IrgendeinStrukt[0];
erzeugt das ein Array von der Stuktur?
auf den Heap?
und wie loesche ich das wieder
delete S;?
loesche ich dann das komplette Array( wenn ich sowas ueberhaupt erschaffen habe )
oder nur den ersten Eintrag?Danke muli
-
Hm, ganz ehrlich frage ich mich, was der Compiler dazu sagt.
EinStruct s* = new EinStruct[0];
erzeugt einen Pointer auf ein Array der Größe 0. Komisch...Mit delete s; gibst du den Speicher des Objekts hinter s frei.
-
Mit new[] angeforderter Speicher _muss_ mit delete[] freigegeben werden! Anderes wäre undefiniert. Manchmal klappt´s, manchmal nicht
also lassen!Ein dynmaisches anglegtes Array der länge 0 ist glaube ich zulässig, nur bringt es nichts

-
was für eine Adresse bekommt man denn da? Theoretisch doch der erste freie Speicher, und der ist 1, da ist platz. Oder 0, weil man sowiso nichts reinschreiben oder raushohlen darf?
-
Ich glaube, da darf die libstdc++ quasi tun was sie will. Die vom GCC gibt bei diesem Programm:
#include <iostream> int main () { for (int i = 0; i < 0x10; ++i) std::cout << i << ": " << (operator new (0)) << ' ' << (std::malloc (0)) << std::endl; }folgendes interessantes aus:
0: 0x400310 0x400300 1: 0x400330 0x400320 2: 0x400350 0x400340 3: 0x400370 0x400360 4: 0x400390 0x400380 5: 0x4003b0 0x4003a0 6: 0x4003d0 0x4003c0 7: 0x4003f0 0x4003e0 8: 0x400410 0x400400 9: 0x400430 0x400420 10: 0x400450 0x400440 11: 0x400470 0x400460 12: 0x400490 0x400480 13: 0x4004b0 0x4004a0 14: 0x4004d0 0x4004c0 15: 0x4004f0 0x4004e0Also ist operator new offenbar mit malloc implementiert. Und dafür ist nach C-Standard das Verhalten bei Anforderung von 0 Byte klar implementierungsabhängig.
7.20.3 Memory management functions ... If the size of the space requested is zero, the behavior is implementation defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
-
for (int i = 0; i < 24; ++i) { int* p = new int[0]; std::cout << p << std::endl; delete[] p; }Gibt bei mir 24-mal die gleiche Adresse aus. Es scheinen allerdings Memory-Leaks zu entstehen, wenn man das Array nicht freigibt.
Gruß
Don06
-
Danke bei mir entstanden auch Speicherleaks.Bin jetzt aber ein wenig schlauer.
