(C++) objekte und signal...



  • hallo,
    ich hab in einem programm eine endlosschleife. vor der endlosschleife
    definiere ich mehrmals ein paar zeiger auf versch. klassen. das problem
    ist nun mein programm beendet sich nicht von selbst, d.h. die zeilen mit
    delete ..., werden gar nicht ausgefuehrt. das programm muss mit CTRL-C oder
    kill beendet werden ( meine netten zeilen werden dabei uebersprungen, nehme
    ich an ).da ich aber gelesen habe, dass das auslassen der delete anweisungen
    zu speicherlecks und aehnlichen spaessen fuehrt wollte ich das ganze mit
    signal( ) umgehen. nun mein problem: ich hab eine funktion cleanup:

    void cleanup( in sig )
    {
        delete abc;
        delete cba;
    }
    

    die funktion selbst, kennt die objekte aber gar nicht! ich kann sie nicht aus der cleanup funktion aus, aus dem speicher werfen... 😞

    so, ich hoffe mal diese signal-sache ist linux-spezifisch, ansonsten bitte ich um entschuldigung und verschiebung... 😉

    ciao



  • du koenntest alle objekte (genauer deren adresse) in eine liste einfuegen.
    die liste machst du global.
    in deiner signal funktion loeschst du die liste.



  • wie genau, mach ich diese "liste" global?
    koennte ich dann nicht gleich die objekte global machen und sie dann
    loeschen? ich hatte noch daran gedacht die addresse der objekte an die
    cleanup funktion zu uebergeben und dann zu loeschen, ich nehme aber stark an,
    dass signal, dann damit nicht klar kommt...

    danke erstmal + ciao 🙂



  • natuerlich koenntest du alle objekte global machen, was aber nicht so
    schoen ist.
    besser ist es du hast nur ein globales objekt (naemlich die liste),
    das du dann loeschst.
    global ist eine variable/objekt wenn es ausserhalb einer funktion definiert
    wird:

    meineliste* l; // globale variable l
    
    void cleanup( int s )
    {
    delete l;
    }
    
    int main()
    {
    l = new meineliste();
    ...
    }
    


  • Oder du verlässt dich auf dein OS, was den Speicher idr. eh freigibt 🙂



  • so,
    ich hab mir mal noch 'ne klasse cleanup geschrieben, und dann...
    naja seht selbst 😉 :

    class cleanup
    {
      public:
        cleanup( class abc *abc, class cba *cba );
      private:
        abc *abc2;
        cba *cba2;
    };
    
    cleanup::cleanup( class abc *abc, class cba *cba )
    {
      abc2 = abc;
      cba2 = cba;
    }
    
    cleanup *cl;
    
    int main( ... )
    {
      cl = new cleanup( objekt1, objekt2 );
      .
      .
      .
    }
    
    void fcleanup( int sig )
    {
      delete cl;
    }
    

    so richtig glaube ich nicht, dass das richtig ist. 😃
    was meint ihr?

    ciao

    [ Dieser Beitrag wurde am 28.12.2002 um 12:53 Uhr von cypoc editiert. ]



  • vielleicht hilft dir so was wie auto_ptr?

    Ich verschiede das mal in das ISO C++ Forum, da es kein Linux spezifisches Problem ist ->


Anmelden zum Antworten