wird dynamischer speicher gelöscht?



  • Moin, ich bin neu hier. 🙄

    Ich bin gerade dabei mich mit dem dynamischen Speicher zu beschäftigen.
    Nun hab ich eine kurze Frage. Also ich starte mein Programm mit
    System("start bla.exe") neu und hab den Namen mit einem pointer von argv[0]übertragen.
    Meine Frage ist nur, wird danach noch der dynamische Speicher gelöscht, wenn
    ich es so schreibe:

    system(ptr);  
    delete [] ptr;
    

    Weil das Programm ja doch schon wieder neu läuft und der Rest ignoriert wird.
    Soweit ich mich nicht irre 😃



  • Pointer != dynamischer Speicher

    Nicht alles, was ein Zeiger ist, ist gleichzeitig ein Zeiger auf einen dynamisch allokierten Speicherbereich.

    Du bekommst einen Zeiger auf Speicher, der vom OS reserviert wurde, da brauchst du dich nicht um die Freigabe zu kümmern. Als Faustregel gilt: Alles, was du mit malloc/new allokierst und nicht in einen SmartPointer verpackst musst du mit free/delete wieder freigeben.
    Wenn du von irgendwoher einen Zeiger bekommst und die API dir nicht vorschreibt, wie der abzuräumen ist, brauchst du den nicht selbst freizugeben.



  • Du schreibst total wirr. Musste alles 3x lesen bevor ich auch nur ne Vermutung hatte was du meinst.

    system() startet einen neuen Prozess.
    Dein alter Prozess läuft aber weiter, "der Rest" wird also nicht ignoriert. (Normalerweise -- system() ist ja schliesslich keine Standard-Funktion, und kann daher auch unterschiedlich implementiert sein. Kannst du aber auch super-einfach prüfen, du musst ja bloss mal versuchen im "Rest" mal nen printf o.Ä. zu machen.)

    D.h. natürlich solltest du Speicher den du im alten Prozess angefordert hast auch im alten Prozess freigeben.

    Und BTW: Speicher löscht man nicht, den gibt man frei. Objekte löscht man.



  • DocShoe: Verzeihung, ich hätte vielleicht erwähnen sollen.Ich hab davor mit new Speicherplatz freigegeben.

    hustbaer: Aus meiner Sicht hab ich es so gut beschrieben, wie es für mich möglich war. Das nächste mal versuche ich es besser. Ich habe dahinter ja noch befehle stehen, die ignoriert oder zumindest nicht angezeigt wurden. Ist bestimmt irgendwo mein Fehler. Es fängt einfach im gleichen Fenster vom Programmstart an. Ich merke mir das mit dem Freigeben für die Zukunft 😃 .

    Also vielen dank für alles an euch beide und ich lass es dann besser so stehen.



  • wenn in deinem Code

    "new" dann musst du "delete" machen
    "malloc" ... "free"

    wenn aus fremden Code z.B.

    Standard-Library
    Externe-Library
    oder z.B. WinAPI etwas als Pointer kommt/erzeugt wird

    ist es vollkommen davon abhängig wie der Entwickler der API es vorgibt
    du musst z.B. freigeben mit delete/free/spezielle Free-Routine usw., oder auch gar nicht weil der externe Code das macht

    alle Varianten sind möglich daher kann man dir dazu keine Standard-Antwort liefern



  • ChukkSatyriasis schrieb:

    DocShoe: Verzeihung, ich hätte vielleicht erwähnen sollen.Ich hab davor mit new Speicherplatz freigegeben.

    Erstaunlich. Was du so alles kannst... man lernt nicht aus 😮



  • @ChukkSatyriasis
    Welche IDE verwendest du, welches OS und was für ein Anwendungstyp ist dein Programm?

    Oder auch: Was bekommst du angezeigt wenn du den Cursor in deinem Source-Code in den Funktionsnamen "system" stellst und F1 drückst?



  • hustbaer: Also meine IDE ist VC++ 2010 Express. Ich benutze Windows 10 und der Anwendungstyp ist die Konsole.
    und wenn ich das mit dem Courser und F1 mache, dann kommt eine Seite die mir sagt, das Thema wurde nicht gefunden.

    Sorry, das die Antwort etwas gebraucht hat. Immer diese Realität.. huh



  • Das wäre dann diese Funktion:
    https://msdn.microsoft.com/en-us/library/277bwbdz.aspx

    Der Grund für das beobachtete Verhalten wird dann sein:
    Die Funktion kommt erst zurück wenn das Aufgerufene Programm fertig gelaufen ist.
    (Also wenn man mit system() eine GUI Applikationen startet, dann wartet system() vermutlich nicht, was eine Eigenheit der Windows Konsole ist, aber da dein Programm ja eine Konsolenapplikation ist die sich selbst startet...)

    Und was "das Thema wurde nicht gefunden" angeht - dann ist bei der Hilfe irgendwas gar nicht oder nicht richtig installiert. Würde ich an deiner Stelle nachhole, ist schon recht praktisch wenn man Hilfe zu allen Standard-Funktionen einfach per F1 abrufen kann.



  • ChukkSatyriasis schrieb:

    Also meine IDE ist VC++ 2010 Express. Ich benutze Windows 10

    Warum? Es gibt einen aktuellen Compiler umsonst: VS2015



  • hustbaer: Achso, also wenn ich das richtig verstehe, dann muss ich eigentlich nur abfragen, ob der Benutzer das Programm nochmal ausführen will, bis er sich dagegen entscheidet und dann wird der Code vom Aufruf davor weiter durchgeführt. Würde zumindest einen Sinn ergeben für mich. Aber das kann man ja ganz einfach überprüfen. Dann bin ich mal gespannt.

    manni66: Ich hab das VC++ 2010 Express schon früher benutzt und fühl mich damit wohl. Bis jetzt fehlt es mir an nichts und ehrlich gesagt hab ich gar nicht so nach neueren Optionen geguckt. Ich werde das mal nachholen, wenn ich mit den jetzigen Projekten fertig bin.



  • system(command) macht das selbe wie wenn du command in der Konsole eingeben würdest.
    Dabei kommt system() zu dem Zeitpunkt zurück wo du in der Konsole wieder die Eingabeaufforderung bekommen würdest.

    Also das...

    #include <process.h>
    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
    	std::cout << "-------- 1 --------\n";
    	system("dir c:\\windows\\system32 /s > d:\\dir.txt");
    	std::cout << "-------- 2 --------\n";
    
    	size_t count = 0;
    	{
    		std::ifstream file("d:\\dir.txt");
    		std::string line;
    		while (getline(file, line))
    			if (line.find("driver") != std::string::npos)
    				count++;
    	}
    	std::cout << "found " << count << " lines containing 'driver'\n";
    
    	std::cout << "-------- 3 --------\n";
    	system("del d:\\dir.txt");
    	std::cout << "-------- 4 --------\n";
    
    	return 0;
    }
    

    ...funktioniert.
    (Vorausgesetzt es gibt ein d:\ Laufwerk wo du schreiben kannst etc. - ich wollte das Beispiel nicht unübersichtlich machen durch Code der sich z.B. passende Pfade zusammenbaut.)


Anmelden zum Antworten