Array komplett löschen?



  • Hallo,

    Ich bin an sich mit der Benutzung von dem Befehl delete vertraut doch so richtig verstehe ich folgende Thematik nicht.
    Ich habe mir ein kurzes Programm gebastelt wo nicht viel drin ist.
    Erstmal der Code:

    #include <iostream>
    #include <Windows.h>
    
    using namespace std;
    
    unsigned int size = 22000;
    
    int main()
    {
    
    	cout << "Start" << endl;
    	Sleep(3000);
    
    	cout << "Load" << endl;
    	unsigned int** test = new unsigned int*[size];
    	for (unsigned int i=0;i<size;i++)
    		test[i] = new unsigned int[size];
    
    	Sleep(3000);
    	cout << "Delete" << endl;
    
    	for (unsigned int i=0;i<size;i++)
    		delete[] test[i];
    
    	delete[] test;
    
    	Sleep(10000);
    	return 0;
    }
    

    Was passiert?
    Ich starte das Programm und haben nebenbei immer den Task-Manager auf um die Nutzung des Ram's zu sehen.
    Zu Begin ist es weniger als 1 MB Ramverbrauch.
    Im nächsten Schritt wird das Array erstellt - das Programm benötigt ungefähr 175 MB Ram.
    Im letzten Schritt wird das Array gelöscht und das Programm benötigt noch 7 MB Ram. Aber warum? Warum ist es nicht wieder unter 1 MB? Wo kommen die übrigen 6 MB her?


  • Mod

    McRam schrieb:

    Was passiert?
    Ich starte das Programm und haben nebenbei immer den Task-Manager auf um die Nutzung des Ram's zu sehen.
    Zu Begin ist es weniger als 1 MB Ramverbrauch.
    Im nächsten Schritt wird das Array erstellt - das Programm benötigt ungefähr 175 MB Ram.
    Im letzten Schritt wird das Array gelöscht und das Programm benötigt noch 7 MB Ram. Aber warum? Warum ist es nicht wieder unter 1 MB? Wo kommen die übrigen 6 MB her?

    Wenn du Speicher freigibst, heißt das noch lange nicht, dass die Laufzeitumgebung deines Programms (das heißt der Code, der hinter new/delete sitzt) den Speicher an das Betriebssystem zurück gibt. Das wäre unnötig und ineffizient. Zudem brauchen new und delete auch einen gewissen Platz für ihre eigenen Verwaltungsdaten.
    Wenn du dieses Verhalten ändern möchtest (du willst das als Anfänger nicht, dies ist nur als Ausblick gedacht), dann musst du direkt mit deinem Betriebssystem sprechen. C++ gibt dir an vielen Stellen die (relativ) einfache Möglichkeit, deine eigenen Speicherverwaltungsfunktionen zu benutzen.

    Und da du offensichtlich Anfänger bist, ein paar Bemerkungen:
    -Der Windows-Taskmanager ist nicht gerade ein gutes Tool, um ein Programmverhalten zu analysieren. Es ist für den Laien kaum erkennbar, was da überhaupt genau angezeigt wird. Die einfachen Beschreibungen wie "Speicherverbrauch" sind irreführend. Soweit ich weiß, ändert sich sogar bei einigen Windowsversionen, was da genau angezeigt wird, was die Sache noch komplizierter macht.
    -Dir ist schon klar, dass das, was du da machst kein 2D-Array ist?
    -Dir ist auch klar, dass man das in C++ niemals so machen würde?



  • "-Dir ist schon klar, dass das, was du da machst kein 2D-Array ist?"
    Sondern?

    -Dir ist auch klar, dass man das in C++ niemals so machen würde?
    Was hat das damit zu tun? Hier gings darum schnell mal was in den Ram zu laden und zu löschen. Das sollte man eigentlich erkennen können.


  • Mod

    McRam schrieb:

    "-Dir ist schon klar, dass das, was du da machst kein 2D-Array ist?"
    Sondern?

    Eine Auflistung einzelner Arrays.

    -Dir ist auch klar, dass man das in C++ niemals so machen würde?
    Was hat das damit zu tun? Hier gings darum schnell mal was in den Ram zu laden und zu löschen. Das sollte man eigentlich erkennen können.

    Das hat damit zu tun, dass dir wohl offensichtlich nicht klar ist, dass man new/delete und Pointer so nie benutzen würde. Das kann man an deiner Reaktion erkennen. Die Bemerkung hatte den Zweck, dich davon abzuhalten, dir falsche Programmiermuster anzugewöhnen, die du dir später nur schwer wieder abgewöhnen kannst.



  • Dann würde ich es noch gerne korrekt sehen wollen, bitte.


  • Mod

    McRam schrieb:

    Dann würde ich es noch gerne korrekt sehen wollen, bitte.

    Was genau?



  • McRam schrieb:

    Dann würde ich es noch gerne korrekt sehen wollen, bitte.

    Da in deinem Beispiel size konstant ist, wäre gar keine Speicherallokation notwendig und es wäre daher korrekt diese nicht anzuwenden.

    Wenn man davon ausgeht, dass size nicht konstant ist, dann kann man auf STL Container zurückgreifen. Als relatives simpel soll hier mal std::vector dienen:

    #include <iostream>
    #include <vector>
    #include <Windows.h>
    
    using namespace std;
    
    unsigned int size = 22000;
    
    int main()
    {
    
        cout << "Start" << endl;
        Sleep(3000);
    
        cout << "Load" << endl;
    
    	std::vector<std::vector<unsigned int>> test(size);
    
       // unsigned int** test = new unsigned int*[size];
        for (unsigned int i=0;i<size;i++)
    		test[i].reserve(size);
          //  test[i] = new unsigned int[size];
    
        Sleep(3000);
        cout << "Delete" << endl;
    
        //for (unsigned int i=0;i<size;i++)
        //    delete[] test[i];
    
        //delete[] test;
    
        Sleep(10000);
        return 0;
    }
    

    Letztendlich hängt die Entscheidung, ob STL Container und welcher aber vom konkreten Anwendungsgebiet ab.



  • #include <vector>
    #include <chrono>
    
    int main(){
        std::this_thread::sleep_for(std::chrono::milliseconds(3000));
        const unsigned int size = 22000;
        std::vector<unsigned int> v(size * size);
        std::this_thread::sleep_for(std::chrono::milliseconds(10000));
    }
    

    Du hast aber das "Risiko" dass das wegoptimiert wird.



  • was macht der sleepbefehl und unter welcher headerdatei findet man ihn?


  • Mod

    sdfsdff schrieb:

    was macht der sleepbefehl und unter welcher headerdatei findet man ihn?

    Wenn du kein Forum hättest, wie würdest du dir diese Frage selber beantworten?



  • sdfsdff schrieb:

    was macht der sleepbefehl und unter welcher headerdatei findet man ihn?

    Hier.


Anmelden zum Antworten