Announcement

Collapse
No announcement yet.

Speicherleck bei pthread-wrapper Implementierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speicherleck bei pthread-wrapper Implementierung

    Hallo,

    ich habe mich vor kurzem mal wieder begonnen, mich mit C++ zu beschäftigen...ich habe eine kleine ThreadWrapper-Klasse für pthreads geschrieben. Viel kann sie noch nicht, lediglich einen Thread starten. Die Idee ist, dass man von dieser Klasse dann Subklassen bildet, eine abstrakte "run"-Methode überschreibt, und so eigentlich von den pthreads gar nichts mehr sieht. Die ThreadWrapper-Klasse ist so implementiert, dass sie das Objekt nach Beendigung der "run"-Methode selbst aufräumt. Man sieht es auch im Konsolenoutput: Der Destructor der Subklasse wird wirklich aufgerufen.

    Soweit, so gut. Prinzipiell funktionniert es auch. Nur leider scheint irgendwo noch Speicher verloren zu gehen.

    Ich habe mein kleines Beispielprogramm angehängt (ich entwickle auf einem Mac). Es wird in einer Schleife jeweils ein neues Objekt erzeugt. Pro Schleifendurchlauf sehe ich in der Aktivitätsanzeige des Prozesses, dass 4Kb mehr Speicher für den Prozess benötigt werden. Ich hoffe man kann das auch auf anderen PCs nachvollziehen.

    Wäre sehr dankbar über jegliche Hilfe!

    Grüße
    Attached Files

  • #2
    Ich kann das jetzt nicht runterladen, aber

    Es wird in einer Schleife jeweils ein neues Objekt erzeugt. Pro Schleifendurchlauf sehe ich in der Aktivitätsanzeige des Prozesses, dass 4Kb mehr Speicher für den Prozess benötigt werden.
    wenn ein neues Onjekt erzeugt wird, wird auch Speicher benötigt
    Christian

    Comment


    • #3
      Aber wenn ich das allokierte Objekt wieder mit delete(...) lösche, dann müsste der entsprechende Speicher ja auch wieder frei werden. Und ich habe im Destruktor des Objektes eine Konsolenausgabe eingebaut. Diese wird in jedem Durchlauf ausgegeben. D.h. das Objekt wird sicher wieder freigegeben.

      Comment


      • #4
        Kann das nicht starten, das pthread.h nicht zu meinem Compiler gehört...

        In der main werden neue PrintWorker angelegt, die nie gelöscht werden
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          In der main werden neue PrintWorker angelegt, die nie gelöscht werden
          Genau das ist aber im ThreadWrapper.cpp der Fall: Nachdem die "run"-Methode durchgelaufen ist, löscht sich das Objekt quasi selbst...(staticLoop-Methode)...und der PrintWorker erbt ja vom ThreadWrapper...und ich sehe ja auch in der Konsole, dass der Destruktor des PrintWorkers aufgerufen wird...

          Comment


          • #6
            Auf die Schnelle: Du hast

            > pthread_attr_destroy(&mAttr);
            > pthread_detach( mStruct );

            mit
            > pthread_t mStruct;
            > pthread_attr_t mAttr;

            beim Destructor vergessen. Du übergibst leere Attribute ... ich hab da folgendes:

            > pthread_attr_init( &mAttr );
            > pthread_attr_setdetachstate( &mAttr, PTHREAD_CREATE_JOINABLE );
            > pthread_attr_setstacksize( &mAttr, 1024 ); // Stacksize = cnt of threads
            > pthread_attr_setschedpolicy( &mAttr, SCHED_RR ); // realtime round robin
            > pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL );

            Gruß Bobbin

            Comment


            • #7
              Hallo,

              vielen Dank für die Antwort.

              An den Attributen liegt es nicht mal. Was wichtiger ist, ist der detach-Aufruf. Mit dem Aufruf drin, wird der Speicher beim Beenden des Threads endlich freigegeben. Der detach-Aufruf kann sogar gleich nach dem Erstellen passieren!

              Vielen Dank nochmals für den Hinweis!

              Viele Grüße,
              Markus Bischof

              Comment

              Working...
              X