Zugriffsverletzung bei NMPOP3 Host



  • Hallo,

    Wenn ich folgenden Code übersetzen lasse kommt die Fehlermeldung Zugriffsverletzung. Kann mir jemand sagen warum?
    Ich kenne die meldung nur wenn ich auf Speicher zugreiffen will den ich nicht reserviert hab.

    #include <NMsmtp.hpp>
    #include <NMpop3.hpp>
    #include <NMftp.hpp>
    #include <vcl.h>
    
    TNMSMTP *NMSMTP1;
    TNMPOP3 *NMPOP31;
    TNMFTP *NMFTP1;
    int main()
    {
            NMPOP31->TimeOut = 20000;
            NMPOP31->Password = "*******";
            NMPOP31->Host = "**************"; // Hier kommt der Fehler
            if(!NMPOP31->Connected){
                    NMPOP31->Connect();
            }
            NMSMTP1->TimeOut = 20000;
            NMSMTP1->Host = "***************";
            NMSMTP1->PostMessageA->FromAddress = "*************";
            NMSMTP1->PostMessageA->FromName = "***********";
            TStringList *Email;
            Email->Add("******************");
            NMSMTP1->PostMessageA->ToAddress = Email;
            NMSMTP1->PostMessageA->Subject = "Das ist ein Test";
            TStringList *Body;
            Body->Add("Servus aus der Konsole");
            NMSMTP1->PostMessageA->Body = Body;
            if(!NMSMTP1->Connected){
                    NMSMTP1->Connect();
            }
            NMSMTP1->SendMail();
            ShowMessage("Sollte gesendet haben!");
            return 0;
    }
    

    Bin für jede Hilfe Dankbar



  • Sascha_Thiel schrieb:

    Hallo,

    Wenn ich folgenden Code übersetzen lasse kommt die Fehlermeldung Zugriffsverletzung. Kann mir jemand sagen warum?
    Ich kenne die meldung nur wenn ich auf Speicher zugreiffen will den ich nicht reserviert hab.

    Und genau das ist auch hier der Fall - du hast zwar einen Zeiger TNMPOP3 *NMPOP31; definiert, aber der zeigt ins Nirvana, also schreiben die ganzen NMPOP31->... Zugriffe auf Speicher, der dir nicht gehört.

    PS: Warum die ersten beiden Zuweisungen funktionieren? Vermutlich Glück.
    "Undefiniertes Verhalten" bedeutet nicht unbedingt sofortigen Abbruch oder SegFault - das kann auch bedeuten, daß das Programm deine Anweisungen schluckt und die Daten irgendwohin schreibt.



  • Wie muß die Deklaration dann aussehen, steh gerade voll auf dem schlauch.

    Sorry

    Edit: hab das sonst mit Forms gemacht.



  • Entweder du definierst die Variable direkt im Datensegment (alternativ auch auf dem Stack - C++ kennt lokale Variablen, also ist es nicht nötig, alle Variablen global anzulegen ;)) oder du reservierst dir per new Heap-Speicher für die Variable:

    //a:
    TNMPOP3 nmPop31;
    //Zugriffe gehen über nmPop31.irgendwas
    
    //b:
    TNMPOP3* nmPop31 = new TNMPOP3;
    //Zugriffe gehen über nmPop31->irgendwas
    

    (PS: Nur eine Stilfrage - Varaiblennamen komplett in Großbuchstaben sehen sch*** aus)



  • Hallo

    Das Prinzip hat CStoll ja schon erklärt. Allerdings lassen sich die meisten VCL-Klassen nicht auf dem Stack anlegen, so auch die hier.
    Da TNMPOP3 eine VCL-Komponente ist, hat sie keinen Standard-Konstruktor, sondern einen Parameter der einen Owner als Parameter benötigt. Ohne eine GUI-Form hast du aber keinen sinnvollen, also kannst du auch einfach 0 übergeben. Und natürlich must du nach dem Benutzen das angelegte Objekt wieder löschen.

    TNMPOP3* nmPop31 = new TNMPOP3(0);
    // benutzen
    delete nmPop31;
    

    Zur namensgebung : Das ist offensichtlich kopierte Code, der Name des Pointers wurde von der IDE automatisch vergeben und ist unschön. Vor allem die letzte 1 ist eine reine Zählmarkierung und unnötig.

    Und nicht zuletzt gehört das ins Builder-Forum. 😉

    bis bald
    akari



  • OK, danke für deine Hilfe.

    Zu den Namen, macht der Gewohnheit, bei Forms legt die IDE alle Kommponenten mit Groß Buchstaben an.

    Edit: Danke für eure Hilfe, Sorry das ich das falsche Forum gewählt hab, hab das noch nicht so ganz raus was wo hin und so, dachte weil es ein Konsolenprogramm ist.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten