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 0x4004e0
    

    Also 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.
    👍


Anmelden zum Antworten