Kann es trotz Raii Memoryleaks geben?



  • Ich frag mich halt, ob es wirklich Sache des Betriebssystems is, den Speicher im Falle eines solchen Absturzes freizugeben, wie cooky451 sagt, oder ob es auch Systeme gibt, die das nicht machen.



  • raiier schrieb:

    Ich frag mich halt, ob es wirklich Sache des Betriebssystems is, den Speicher im Falle eines solchen Absturzes freizugeben, wie cooky451 sagt, oder ob es auch Systeme gibt, die das nicht machen.

    Es ist völlig egal ob es Systeme gibt die das nicht machen - du bist dafür schlicht und einfach nicht zuständig. Ende, aus. Da kannst du nichts gegen machen, weil du keinen Code mehr ausführen kannst. Keine Sprache und kein Programm/-design der Welt kann dir da weiterhelfen.



  • Du bist eher dafür zuständig, dass dein Programm gar nicht erst abstürzt 🙂



  • Mal einfach mehr als einen Satz bei Wikipedia lesen, z.B. den zweiten: http://de.wikipedia.org/wiki/Betriebssystem . Und ja, es gibt auch Systeme die das nicht so machen.



  • raiier schrieb:

    Ich habe mich schon oft gefragt, ob es trotz der Verwenudng des RAII-Prinzips Memoryleaks geben kann. RAII kann ja noch für mehr als das Memory-Management einer Anwendung verwendet werden, aber mir geht es bei der Frage eben nur um Memoryleaks.

    Ich stelle mir z. B. die Frage was passiert, wenn ich sowas hab:

    #include <tr1/memory>
    
    using namespace std::tr1;
    
    int main()
    {
        shared_ptr<int> p(new int);
    
        /*
        ... hier stürzt das Programm ab
        */
    
        return 0;
    }
    

    Und da wo jetzt der Kommentar steht, stürzt das Programm unerwartet ab ohne dass der Pointer gelöscht wird. Dann wird der Speicher nicht freigegeben, da auch der Destruktor von p nicht aufgerufen wird.

    Kann sowas denn sein?

    Ja, z.B. wenn die C-Funktion exit(..) aufgerufen wird, dann werden die Destruktoren von C++ Objekten nicht aufgerufen. Auch andere Funktionen können dazu führen.



  • Die Antwort recht klar im C++-Standard steht. Solange man kein undefiniertes Verhalten in seinem Programm herbeiführt, gilt RAII, sofern es nicht anders definiert ist. Naturgemäss lässt ein Aufruf wie exit gar kein RAII zu, weshalb es dann zu einem Leak kommt. Dafür haben die Götter allerdings einen besseren Mechanismus gefunden: Exceptions!

    Also: Du musst dafür sorgen, dass dein Programm nicht abstürzt. Wenn es irgendwo abstürzt und damit undefiniertes Verhalten erzeugt, hast du keine Garantie dafür, dass du noch etwas aufräumen kannst.

    Wegen den Betriebssystemen, welche den Speicher in solchen Fällen nicht einfach freigeben: Die werden immer seltener, aber auf extrem kleinen Geräten war es so üblich, da es einfacher und günstiger umzusetzen war.



  • Stell dir mal ein Betriebssystem vor, das Speicher nicht automatisch wieder freigibt, wenn ein Programm, wie auch immer, beendet wird.

    Systeme die sowas nicht machen, haben meistens auch nen guten Grund für. Meistens sind die Systeme dann auch so konzipiert, das bei "Absturz" eines programms, das ganze System versagt, bzw in frage gestellt wird. (neu booten meistens).

    Bei Systemen wo mehrere Prgramme usergesteuert (quasi) nebenher laufen, wird man heutzutage davon ausgehen koennen, das bei Beenden (natuerlich oder unnatuerlich) alle ressourcen (auch stack und heapspeicher) wieder freigegeben werden. Ansonsten waere kooperativer Betrieb mehrerer Programme gar ned so möglich.

    Und BS die Paging (http://de.wikipedia.org/wiki/Paging) verwenden, da iss das zuordnen von Speicher zum Programm, und damit die Möglichkeit beim Absterben des progs den Speicher wieder freizugeben, quasi grundfunktion ...

    Was ned heisst das dich drauf verlassen solltest 🙂
    Dein Programm darf einfach ned sterben ! sonst ist es kein gutes Program !
    Nur sollt/darf sich nen Multitasking BS auch gegen schlechte Programme schuetzen! Und da gehoert Rerssourcenkontrolle elementar dazu.

    Ciao ...



  • Speicherlecks sind wohl bei den geschilderten Szenarien (Absturz, Aufruf von exit, TerminateProzess etc.) das geringere Problem.
    Es gibt aber auch Ressourcen (Mutexe oder andere Hardware Ressourcen) die unter solchen Umständen nicht freigegeben werden.

    RAII ist natürlich eine immense Hilfe, kann aber bestimmte Fälle auch nicht abhandeln, weil sie sich eben auf einer tieferen OS-Ebene abspielen. Es bleibt dann auch nur sich mit SEH und anderen Sachen auseinanderzusetzen.



  • aber das hiesse ja im umkehrschluss, dass man immer über speicherlecks stolpern kann obwohl man als programmierer(der ja genau dafür verantwortlich ist) nicht falsch gemacht hat.

    wenn selbst RAII nicht immer hilft, was dann?


  • Mod

    Wenn jemand von außen dein Programm abschießt, bist du als Programmierer nicht verantwortlich, dass ordentlich aufgeräumt wird. Du kannst schließlich auch gar nichts mehr tun. Das liegt dann in der Verantwortung von demjenigen der dies getan hat, bzw. dem System, welches er dafür benutzt hat.



  • Skym0sh0 schrieb:

    aber das hiesse ja im umkehrschluss, dass man immer über speicherlecks stolpern kann obwohl man als programmierer(der ja genau dafür verantwortlich ist) nicht falsch gemacht hat.

    wenn selbst RAII nicht immer hilft, was dann?

    Als Programmierer einer Applikation möchte man, dass sie in normalem Zustand keine Lecks produziert. RAII ist da lediglich eine Hilfe, dass man nicht dran denken muss Ressourcen von Hand freizugeben und in dem Sinne nicht direkt um Speicherlecks zu verhindern (ist ja ein allgemeines Konzept). Es hilft also lediglich dumme Fehler zu vermeiden.
    Speicherlecks um jeden Preis zu vermeiden ist schlussendlich die Sache des Betriebssystemes, welches ja Heutzutage eine spezielle Umgebung für Programme bietet, damit es das auch tun kann. Bei einem nicht normalem Beeinflussung deines Programmes (üblicherweise Beendigung) ist es die Verantwortung des OS wieder alles aufzuräumen.


Anmelden zum Antworten