[C/C++] Problem mit Zeiger und list

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Pac_-_man, 10. August 2007 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  1. #1 10. August 2007
    Problem mit Zeiger und list

    Hi!

    Ich hab ein kleines Problem, dessen Loesung wahrscheinlich garnicht so schwer ist, aber ich komm da grad irgendwie nicht so richtig weiter. Das Problem ist auch das ich nicht ale Methoden einer std::list kenne. Ich poste mal kurz eiun paar Zeilen Code um mein Problem zu schildern:

    Code:
    //Also: Ich hab einen Selbst-erstellten Datentyp: CCube, der einen Wuerfel repraesentiert.
    
    //Dan erstelle ich nen Zeiger und ne Liste davon
    CCube* m_pCube;
    std::list<CCube*> m_CubeList;
    
    //Die Liste wird mit Wuerfeln gefuelt und geleert (alles dynamisch waehrend der Laufzeit)
    CCube* pCube = new CCube;
    //m_pCube auf die Adresse des neuen Wuerfels setzen
    m_pCube = pCube;
    //und pCube zur Liste hinzufuegen
    m_CubeList.push_back(pCube);
    //Der Zeiger m_pCube zeigt nun auf ein Element in der Liste
    
    //Jetzt wird der Wuerfel mithilfe eines Iterators geloescht
    for(std::list<CCube*>::iterator it = m_CubeList.begin(); it != m_CubeList.end(); it++)
    {
     delete *it;
     it = m_CubeList.erase(it);
    }
    
    //Wie kann ich jetzt auf ganz einfache Art und Weise pruefen, ob m_pCube noch auf einen gueltigen Wuerfel aus der Liste verweist?
    
    
    Hoffe ich konnte mein Problem deutlich genug machen. Es geht eigentlich nur daum, ob es irgendeine bestimmte Abfrage gibt, mit der man pruefen kann, ob eine Objekt in einer Liste, auf das noch ein Zeiger zeigt, mit erase() geloescht wurde oder so...

    MFG
    Pacman
     

  2. Anzeige
  3. #2 10. August 2007
    AW: Problem mit Zeiger und list

    Du kannst im Konstruktor eine Variable Anzahl anlegen und für jeden erzeugten Würfel wird der Wert inkrementiert (Variable sollte global und mit 0 initialisiert sein) oder du prüfst einfach ein Element von dem Objekt.
     
  4. #3 10. August 2007
    AW: Problem mit Zeiger und list

    Naja, also das Problem ist, das zur Laufzeit staendig Wuerfel erzeugt und geloescht werden und das auch in zufaelliger Reihenfolge. Aber einer der aktuell erzeugten Wuerfel hat immer den Zeiger m_pCube auf sich gerichtet und zwar so lange, bis er geloescht wird. Dann verweist der Zeiger m_pCube auf ungueltigen Speicher. Und genau das Event muss ich irgendwie abfangen, damit ich den Zeiger auf einen neu erzeugten Wuerfel setzen kann.

    Das Problem ist halt nur das ich hunderte Wuerfel habe, und nur auf einen zeigt m_pCube. Alle Wuerfel werden in jedem Schleifendurchlauf kontrolliert, ob sie zerstoert werden sollen. Wenn dann der Wuerfel auf den m_pCube zeigt dabei ist, muss ich das irgendwie in dem Moment (wo er geloescht wird) oder hinterher (also wenn er schon geloescht ist) abfragen... Nur wie? Am Besten fuer mich waere, wenn man es hinterher feststellen kann... Und zwar nur ob der Zeiger noch auf nen gueltigen (also noch nicht geloeschten) Wuerfel zeigt...
     
  5. #4 10. August 2007
    AW: Problem mit Zeiger und list

    Hi...machs doch in nem try / catch...versuch im try auf den Würfel zuzugreifen. Wenn du ne Exception bekommen solltes (eventuell ne NullPointerException), setzte im Catch einfach den Zeiger neu. Oder du prüfst beim löschen ob dein Zeiger auf den zu löschenden Würfel zeigt. Wenn ja, setz ihn neu, ansonsten lösch den Würfel.
    Mfg
    Sinus2K
     
  6. #5 10. August 2007
    AW: Problem mit Zeiger und list

    Hi!

    Die Idee ist nicht schlecht. Aber ich weiß noch nicht genau wie du das meinst. Denn wenn man mit Try und Catch arbeitet, muss doch bei dem Versuch auf den Wuerfel zuzugreifen ein 'throw' - Ereignis von dem Wuerfel zurueckgegeben werden oder? Aber wenn der Wuerfel schon zerstoert ist, kann er doch nichts mehr aufrufen... ?( Vlt kannst du ein kleines Beispiel geben mit den Zeigern die ich oben verwendet habe. Eine Methode von den Wuerfeln kannst du dir ja ausdenken und den Rueckgabewert auch...
     
  7. #6 10. August 2007
    AW: Problem mit Zeiger und list

    Ok, ist schon ne Weile her das ich mich an C++ versucht hab. Bin mehr auf Java und C# umgestiegen, aber ich versuchs trotzdem.
    In meiner Theorie sollte das funktionieren und ne NullPointerException werfen:

    Code:
    try
    {
     m_pCube->getIrgendwasWichtiges();
    }
    
    catch (NullPointerException e)
    {
     //neuzuweisung des Pointers
    }
    
    Sollte das nicht funktionieren würde ich es halt schon beim löschen überprüfen. Das sollte auf jedenfall gehen.
     
  8. #7 10. August 2007
    AW: Problem mit Zeiger und list

    Kann es sein das ich dafür noch ne bestimmte Header-Datei einfügen muss? Bei mir kennt er die NullPointerException nicht.

    Edit: Kann es sein das es dieses Event nur in Java gibt? Find nämlich im MSDN nur Links zu Java-Implementierungen
     
  9. #8 10. August 2007
    AW: Problem mit Zeiger und list

    Also wenn es dir nur darum geht den Fehler abzufangen und dann i-wie darauf zu reagieren geht das auch so:

    Code:
    try
    {
     // hier den Code der den Fehler verursacht
    }
    catch (...) // Handler für jede beliebige C++ Exception
    {
     // hier kannst du drauf reagieren
    }
    
    Jedes Mal wenn der Code einen Fehler erzeugt, landest du bei 'catch (...)' und kannst somit darauf reagieren.
    Da kannst du ja den Pointer auch neu zuweisen.

    So verhinderst du zumindest erstmal, dass er die Exception als Meldung ausgibt.



    MfG bonsai
     
  10. #9 11. August 2007
    AW: Problem mit Zeiger und list

    Hi!

    So habs jetzt. Allerdings gings doch nicht mit try/catch, da nirgendwo ein Fehler verursacht wurde. Das war das Problm. Es wurde nur auf undefinierten Speicher zugegriffen...

    Aber naja, ich habs so gemacht das ich einfach ne bestimmte Funktion auf Gültigkeit geprueft habe...

    Trotzdem danke!

    MFG
    Pacman
     

  11. Videos zum Thema
Die Seite wird geladen...