TIdText und TIdAttachment Speicher wieder freigeben



  • Hallo zusammen,

    ich habe in einer Methode folgende Speicherreservierung:

    m_pPlaintext = new TIdText(m_pMessage->MessageParts,m_pStringListHTML);
    m_pPlaintext->ContentType="text/plain";
    
    m_pHTML = new TIdText(m_pMessage->MessageParts,m_pStringListHTML);
    m_pHTML->ContentType="text/html";
    
    m_pHinweisBild = new TIdAttachment(m_pMessage->MessageParts,
                     asEmailbenachrichtigungsPfad + "\\Beispiel.jpg");
    

    diesen reservierten Speicherplatz versuche ich am ende der Methode durch folgende Befehle wieder freizugeben:

    delete m_pHinweisBild;
    delete m_pPlaintext;
    delete m_pHTML;
    

    Doch genau an dieser Stelle wirft das Programm mir eine Exception.
    Kann mir einer sagen, wie ich diesen Speicher wieder freigeben kann??

    Vielen Dank für die Antworten

    Gruß



  • Hallo

    Schau in der Indy-Doku nach, ob du diese Objecte überhaupt selbst freigeben must.
    Denn ich vermute das sie bei m_pMessage registriert werden und von dort auch aus gelöscht werden.

    bis bald
    akari



  • Hi akari,

    hab eben mal nachgesehen und folgendes gefunden:

    TIdText are used as collection items in a TIdMessageParts collection.

    Bestätigt das deine Meinung? Also so wie ich dich verstanden habe, wird der Speicher der z.B. durch ...

    = new TIdAttachment(
    m_pMessage->MessageParts,asEmailbenachrichtigungsPfad + "\\Beispiel.jpg");
    

    reserviert wird mit

    delete m_pMessage
    

    wieder freigegeben, oder??



  • Hallo

    Ja das deutet darauf hin das der Speicher von dem Container verwaltet wird, du also die untergeordneten Items nicht selber freigeben must.

    bis bald
    akari



  • Denn ich habe gerade mal den Quickie auf folgender Seite angesehen:

    http://www.marquardtnet.info/cecke/index.htm

    zum Thema Versenden einer eMail mit den Indy-Komponenten (TidSMTP);

    Da gibt der Autor auch wieder den entsprechenden Speicher frei:

    Aufräumen:

    delete body;
    delete Att;

    Deswegen wundert es mich, dass bei mir der delete - Befehl nicht funktioniert?!



  • Hallo

    dann liegt der Auslöser für die Speicherverletzung aber nicht in deinem Codeauszug, sondern woanders.

    bis bald
    akari



  • Hier mal meine komplette Methode:

    {
    
       AnsiString asEmailbenachrichtigungsPfad;
       TIdText *m_pPlaintext  = new TIdText(m_pMessage->MessageParts,m_pStringListHTML);
       TIdText *m_pHTML       = new TIdText(m_pMessage->MessageParts,m_pStringListHTML);
    
       m_pPlaintext->ContentType="text/plain";
       m_pHTML->ContentType="text/html";
    
       asEmailbenachrichtigungsPfad = mainprogramm->einstellung->
                                      getEmailBenachrichtigungsPfad();
    
       TIdAttachment  *m_pHinweisBild  = new TIdAttachment(
       m_pMessage->MessageParts,asEmailbenachrichtigungsPfad + "\\zeiterfassung.jpg");
    
       m_pStringListHTML->LoadFromFile(asEmailbenachrichtigungsPfad + "\\EMAIL.html");
    
       m_pMessage->MessageParts->Add();
    
    //Emaileinstellungen
          m_pSMTP->Host      = mainprogramm->einstellung->getBenachrichtigungEmailHost();
          m_pSMTP->UserId    = mainprogramm->einstellung->getBenachrichtigungEmailUserID();
          m_pSMTP->Port      = mainprogramm->einstellung->getBenachrichtigungEmailPort().ToInt();
          m_pSMTP->Password  = mainprogramm->einstellung->getBenachrichtigungEmailPasswort();
    
          m_pMessage->Recipients->EMailAddresses = m_asEmailAdresse;//mainprogramm->einstellung->getBenachrichtigungsEmailAdresse();
    
       //Emailangaben
       m_pMessage->From->Text = "TimeCollect";
       m_pMessage->Subject = asEmailBetreff;
    
       //Hier wird der StringListe der Bodytext zugewiesen und in die Message-Komponente
       //kopiert.
       m_pMessage->Body = m_pStringListHTML;
    
       //Versenden der Email
       m_pSMTP->Connect();
       m_pSMTP->Send(m_pMessage);
       m_pSMTP->Disconnect();
    
       //Aufräumen
       m_pStringListHTML->Clear();
       m_pMessage->Clear();
    
       delete m_pHinweisBild;
       delete m_pPlaintext;
       delete m_pHTML;
    
       DeleteFile(asEmailbenachrichtigungsPfad + "\\EMAIL.html");
    
    }
    

    Vielleicht findet man jetzt den Fehler 😉



  • Hallo

    //Aufräumen
       delete m_pHinweisBild;
       delete m_pPlaintext;
       delete m_pHTML;
    
       delete m_pStringListHTML;
       delete m_pMessage;
    

    /Edit : In Annahme das die beiden letzeren Pointer überhaupt auf gültige Instanzen gezeigt haben.

    bis bald
    akari



  • die letzten beiden Komponenten werden im Destruktor gekillt.
    Aber die drei zuvor lösen eine Exception aus!
    Ich habe keine Ahnung, warum die sich nicht löschen lassen.

    Meine Frage ist eigenlich nur, ob es ausreicht die TIdMessage-Komponente zu löschen und ob dann die TIdText und TIdAttachment auch mitgelöscht werden?
    Oder entsteht dadurch ein Speicherloch?

    gibt es in solchen Fällen eine besondere Weise wie ich den Speicher wieder frei geben muss?


Anmelden zum Antworten