Probleme mit Speicheradressen bei STL Listen/Vectoren



  • Hey @all,

    und zwar möchte ich Personendaten, die ich in einer Struktur habe in eine Liste pushen, hier mal die Struktur:

    struct persons { 
      int id; 
      std::string lastname; 
      std::string firstname; 
      std::string nickname; 
      std::string birthdate; 
      std::vector<address> addresses; 
      std::vector<types> emails; 
      std::vector<types> telephones; 
      std::vector<types> faxes; 
      std::vector<types> messengers; 
    
      persons(){} 
    };
    

    die liste und der iterator werden wie folgt erzeugt

    typedef std::list<persons> PersonList; 
    PersonList pl; 
    PersonList::iterator plIter;
    

    So, nun zum Problem, ich schreibe die Anwendung mit BCB. Wenn ich nun eine eigene Liste in einer Methode erstelle, kann ich problemlos pushen

    void CUserData::parseSource(std::string _source) { 
      typedef list<persons> TestListe; 
      TestListe tl; 
      TestListe:iterator tlIter; 
    
      persons p; 
      memset(&p, 0, sizeof(p)); 
      p.lastname = "Mayer"; 
      p.firstname = "Michael"; 
    
      tl.push_back(p); //--> FUNKTIONIERT 
      pl.push_back(p); //--> Hier tritt eine EAccessViolation-Exception auf 
    }
    

    Nun zu meiner Frage, warum kann ich nicht bzw. warum tritt eine Exception auf, wenn ich auf ein Privates Objekt in meiner eigenen Klasse zugreifen möchte, und nicht wenn ich in der Methode ein Objekt erzeuge.

    Mir geht dieser Fehler nicht ein, mein Problem ist nur, das ich die Liste mit den Benutzerdaten noch in anderen Methoden brauche, somit brauche ich dieses Private Objekt (pl)

    Wenn ich mir die Zeigeraddressen der beiden ansehe, dann habe ich bei der Liste die ich in der Methode erzeuge eine Adresse, und bei der Liste die ich in der Klasse erzeugt habe, habe ich den wert NULL:

    PersonList* x = &pl;   // Klassen-Liste (x:NULL)
    PersonList* x2 = &tl;  // Methoden-Liste (x2: 0012F3B0)
    

    So, nun wo ist da jetzt das Problem, das ich in einem Privaten Klassenelement keine Adresse habe?
    Was ist daran falsch?

    Kann mir hier bitte jemand weiterhelfen

    Vielen Dank im Voraus
    Lg _freeze_



  • Hallo

    bist du dir denn sicher, das du eine gültige Instanz von CUserData hast, deren Methode parseSource du dann aufrufst?

    bis bald
    akari



  • Hallo,

    ist parseSource static?



  • Ich habe schon öfters vector und map in ähnlicher Weise verwendet und hatte noch nie derartige Probleme.
    Was ich nicht so ganz verstehe, ist, warum Du zwei typedefs machst?

    Ich mache das z.B. so:

    // Header
    class MyClass
    {
      public:
        MyClass();
    
        void foo();
      private:
        typedef vector<TNode*> TNodeVector;
        TNodeVector FNodeVector;
    };
    // Implementierung
    MyClass::MyClass():
      FNodeVector(TNodeVector())
    {
    }
    
    void MyClass::foo()
    {
      FNodeVector.push_back(new TNode());
    }
    

    Das hat bisher einwandfrei funktioniert.

    Bei Deinem Code-Ausschnitt ist mir nicht ganz klar, wo die Deklaration der privaten Member passiert.

    Gruß,

    Alexander



  • Danke an alle,

    hatte zwar eine Referenz von meiner Klasse, jedoch diese Referenz nicht initialisiert. Ich hatte dies übersehen. Jetzt funktioniert es wieder.

    Lg _freeze_


Anmelden zum Antworten