Der Destruktor wird nicht aufgerufen



  • Das argument verstehe ich nicht,
    was haben die Kopien mit der Existenzunabhängigkeit (?!)
    mit dem Objekt was iteriert werden soll mit hoher Fehleranfälligkeit zu tun ?

    Ok, da habe ich mich wohl wieder nicht so gut ausgedrückt. Die Hashtable erzeugt einen Iterator, gibt diesen zurück und hat danach keine Kenntnis mehr davon und sorgt sich nicht mehr dafür, dass es freigegeben wird. Also ist der Iterator nicht existenzabhängig von der Hashtable. Der Iterator gibt beim durchlaufen die Referenzen auf die Items zurück. Wen man nun einen Item löscht, besitzt die Hashtable Referenz auf ein nicht mehr existierendes Objekt, was zu Fehlern führen kann. Und denn noch muss, dass möglich sein. Und Kopien der Items sind unerwünscht.

    Und ich fürchte, die Java-Herkunft sieht man deinen Programmen auch an 😉 In C++ sollte items() besser keinen Pointer auf einen Iterator übergeben, sondern einen Wert. Der ist dann auch existenzunabhängig von deinem Container - muß aber nicht mehr von Hand beseitigt werden.

    Das könnte man echt machen, das würde dann dem entsprechen:

    HashtableIterator<OGLSchriftart> hti = *nackomen_Schriftart->items();
    

    oder? Und was passiert aber da genau, wo wird dann der Iterator erzeugt? Im Heap? Und hält hti auch die Instanz die erzeugt wurde oder wird diese Kopiert und hti kennt dann die Kopie?

    mfg.



  • Das könnte man echt machen, das würde dann dem entsprechen:

    HashtableIterator<OGLSchriftart> hti = *nackomen_Schriftart->items();
    

    oder? Und was passiert aber da genau, wo wird dann der Iterator erzeugt? Im Heap? Und hält hti auch die Instanz die erzeugt wurde oder wird diese Kopiert und hti kennt dann die Kopie?

    Ok das ist schwachsinnig (weil Speicher verschwendung und Kopie), aber wenn man mit Werten arbeiten würde, so würde man zwangsläufig auch mit Kopien arbeiten, was ich aber vermeiden möchte.



  • Nun schieb die Schuld für den groben Designfehler nicht auf Kopien, Du kannst auch nen const iterator zurück geben.



  • Designfehler 🙂 , war erwünscht.
    Es wird hier nirgends die Schuld auf etwas geschoben, die Kopien waren von vornherein nicht erwünscht das ist alles.
    Und was meinst du mit const, was für einen Vorteil hat es?

    mfg.



  • 9taleFox schrieb:

    Das könnte man echt machen, das würde dann dem entsprechen:

    HashtableIterator<OGLSchriftart> hti = *nackomen_Schriftart->items();
    

    oder?

    Fast - aber besser wäre es, die Methode items() deiner Hashtable anzupassen, daß sie keinen Heap-Speicher anlegt.
    aus

    HashtableIterator<T>* items()
    {
      HashtableIterator<T> it = new HashtableIteator<T>;
      ...
      *it = ...;
      return it;
    }
    

    wird

    HashtableIterator<T> items()
    {
      HashtableIterator<T> it;
      ...
      it = ...;
      return it;
    }
    

    (wichtig: keine Pointer mehr - und keine new-Aufrufe. Dadurch wird der Iterator durch den Stack durchgereicht (und irgendwann automatisch beseitigt).



  • irgendwo in diesem forum stand, daß man c und c++ nicht mischen soll,
    fopen ist c, ifstream c++,
    wenn man das beachtet bekommt man generell keine warnungen(weil man fast in jeder ide unter projekteinstellungen angeben kann ob man ein c oder c++ programm erstellt).!



  • (wichtig: keine Pointer mehr - und keine new-Aufrufe. Dadurch wird der Iterator durch den Stack durchgereicht (und irgendwann automatisch beseitigt).

    Ja so würde das gehen, aber wie schon erwähnt würde die Instanz des öfteren kopiert und gelöscht werden.
    Bespiel:

    HashtableIterator<T> Hashtable<T>::items() 
    { 
      HashtableIterator<T> it; // erste Instanz von HashtableIterator<T> wird erzeugt
      ... 
      return it; // erste I. wird kopiert, somit haben wir eine zweite, und die erste wird gelöscht
    }
    
    ...
    HashtableIterator<T> it = hashtable->items(); // so hat it die Kopie der ersten Instanz
    …
    

    somit hat man einmal kopieren und einmal löschen müssen, und das habe ich mit dem kopieren gemeint, was wir eben vermeiden wollten.

    rgendwo in diesem forum stand, daß man c und c++ nicht mischen soll,
    fopen ist c, ifstream c++,
    wenn man das beachtet bekommt man generell keine warnungen(weil man fast in jeder ide unter projekteinstellungen angeben kann ob man ein c oder c++ programm erstellt).!

    Aha, werde mir mal anschauen.

    mfg.



  • Ist es wirklich so aufwändig, einen Iterator zu kopieren? (btw solltest du erstmal sicherstellen, daß dein Programm ordentlich funktioniert, bevor du dir Gedanken über Performance und die Anzahl der Kopier-Operationen machst)



  • Ok da es auf dem Stack passiert ist dürfte es recht schnell sein, aber es ist ein Teil der GrafikEngine und es wird viel iteriert, daher verzichte ich darauf. Und da das ganze zu der untersten Ebene gehört auf die nachher keiner zugreifen kann ist es in Ordnung so.

    mfg. 🙂


Anmelden zum Antworten