Zugriff auf Zeiger in Vektoren?



  • Hallo,

    ich habe seit einiger Zeit das Problem, dass ich auf keine Zeiger in einem Vektor zugreifen kann. Dabei gibt es immer folgende Ausnahme:

    Unbehandelte Ausnahme bei [...]: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcccccccc.

    Der folgende Quell-Code soll das mal verdeutlichen:

    class DasObjekt
    {
    public:
      int x;
      DasObjekt(int argument)
      {
         x=argument;
      }
    };
    //Weiterer Code
    vector<DasObjekt*> vectorVonDasObjekt(3);
    
    vectorVonDasObjekt[0]=new DasObjekt(5);
    vectorVonDasObjekt[0]->x += 5;
    //Hier wird die Ausnahme gestartet
    
    //Weiterer Code
    

    Wie kann ich die Ausnahme verhindern, bzw. wie erteile ich dem Vektor den Zugriff auf die Variable x?



  • Das sieht ganz in Ordnung aus. Poste mal den echten Code, bei dem der Fehler auftritt.



  • Du hast definitv den falschen Code gezeigt. Dieser hier macht keine Probleme, habs grad mit VS getestet.

    Aus der Fehlermeldung schließe ich, du benutzt auch VS. Und das 0xccccccc zeigt, dass du auf einen Zeiger zugreifst, bevor du mit new was reserviert hast, bzw. ihm einen gülitigen Wert zugewiesen hast.



  • Stimmt, vielen Dank für die Hilfe!
    Nach dem Tipp hab ich den Fehler jetzt gefunden.

    Statt += 5 hab ich in meinem richtigen Code den Wert aus einem Objekt in einem anderen Vektor genommen.
    Und das Objekt hab ich erst nach der Zuweisung erstellt 🙄 .

    Ich hätte ein viel komplexeres Problem vermutet, hätte meinen ganzen Code jetzt umgeschrieben und hätte den Fehler nach Stunden immer noch nicht gefunden... 😃



  • Taeli schrieb:

    hätte meinen ganzen Code jetzt umgeschriebe

    Würde ich auch jetzt noch tun.

    Es gibt bei dir zum Beispiel keinen Grund, warum der Code nicht so aussehen kann:

    vector<DasObjekt> vectorVonDasObjekt;
    
    DasObjekt dot(5);
    dot.x += 5;
    vectorVonDasObjekt.push_back(dot);
    

    Wenn du wirklich Zeiger brauchst (das geht eig. nur wegen der Polymorphie), dann nimm einen vector<unique_ptr<DasObjekt>> oder zumindest shared_ptr, wenn du kein C++11 zur Verfügung hast.

    Bei Vektoren mit Zeigern sind Memory-Leaks und Speicherzugriffsfehler vorprogrammiert.


Anmelden zum Antworten