der heap macht stress ...



  • Hey Leute,
    ich als Neuling im c++ geschäft habe da so meine Probleme. Ich habe eine Klasse geschrieben die mir emails per smtp verschicken kann. also ganz normaler socket krams. falls die email nicht heraus geht so er es gleich noch ml versuchen. daher habe ich das eigentliche verschicken in einen eigenen pthread gelegt.

    Das sieht ungfähr so aus in Email.cpp

    ...
    
    void Email::send(char* txt) { // übergibt den text und startet den thread
     mailtxt = txt;
     pthread_t sendEmail;
     pthread_create(&sendEmail, NULL, sendEmailThread, (void*)this);
    }
    
    void* sendEmailThread(void* ptr) { // nicht member-func von Email!!
     Email *email = (EmailHandler *) ptr; // so komme ich an notwendige daten
    ...schicken der email
    und wenn erfolgreich -> thread terminieren
    
     return 0;
    }
    

    Nur Leider beim beenden bricht mein Programm ab mit der Fehlermeldung

    *** glibc detected *** free(): invalid pointer: 0x08054170 ***
    Aborted
    

    Warum? Macht der heap stress?? aber wieso???
    Gruss david



  • Nur ne Idee...

    dein Objekt, das du mit this an pthread_create übergibst, liegt das auf dem Heap
    oder auf dem Stack?

    Da du ja einen neuen Thread startest reicht, das Objekt auf dem Stack nicht aus, da
    der ursprungliche Thread den ja wieder überschreibt und deswegen hat er dann nen invalid pointer und stürzt ab.

    Sieht für mich jedenfalls so aus...



  • wie das mit dem Speicher genau aussieht weiss ich auch nicht. Dachte, dass der thread auf dem heap geht ... warum auch sonst der Fehler mit free().

    Wie bekomme ich das ursp.Object auf den Heap und somit weg vom Stack? Mit new vielleicht? Verstehe aber was Du meinst 😉



  • Zeig doch einfach mal, wie du Email::send benutzt, und wo das Email-Objekt herkommt.



  • Genau: mit new...

    Die Fehlermeldung mit free kann ja dadurch entstehen, dass du in
    deinem Objekt z.B. nen std::vector hast/hattest, der intern (wahrscheinlich) mit
    malloc alloziiert und er da erstmals beim Löschen nen Segmentation fault kriegst.



  • Also, erst mal vorweg: komme aus der javawelt und mache erst seit 4 monaten c++ mit dem gcc unter linux.

    ich habe eine fassaden-klasse (singleton) wo ich die Klasse Email aufrufe.
    einfach mit:

    Email emailHandler;
    

    Der konstruktor liesst aus einem config file die benötigten werte (zb smtp-server) und setzt diese als member-vars.
    Zu testzwecken startet der konst. die funktion Email::send("blabal");(siehe oben)
    und die endEmailThread liegt ebenfalls in der Email.cpp. Ist aber kein Member von class Email.

    Wenn ich

    Email *pEmail = new Email();
    

    in der Fassadenklasse setze
    ,sieht der Abbruch so aus

    *** glibc detected *** double free or corruption (!prev): 0x08054610 ***
    


  • Problem gelöst:
    musste nur einige pointer auf NULL prüfen und
    vor abbruch des threads auf NULL setzen. Dann
    hatte ich noch eine Speicherleak - jetzt auch
    weg 😉 und habe Email per Extern global in
    meiner app. gemacht. trotzdem DANKE an alle



  • Hmmmm das klingt mir aber nicht nach einer Lösung sondern nach einer Umgehung des Problems ... und danach, als ob Du nochmal Dein Programm(design) zum Thema "Ownership" durchschauen solltest....

    Vielleicht irre ich mich aber auch.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Hmmmm das klingt mir aber nicht nach einer Lösung sondern nach einer Umgehung des Problems ... und danach, als ob Du nochmal Dein Programm(design) zum Thema "Ownership" durchschauen solltest....

    V.a. wundert mich das "trotzdem" in der Dankformel des OP da das Problem genau das ist was CSpille beschrieben hatte...


Anmelden zum Antworten