Stress mit new/delete!?



  • die stammen noch aus ner Zeit, wo ich vergessen hab, die pointer am anfang mit 0 zu initialisieren und fehlermeldungen bekommen hab, weil delete einen undefinierten Zeiger löschen sollte. Egal, es macht ja keinen unterschied.

    Edit: Abgesehen davon soll die Funktion Init nicht nur vom Kontrsuktor, sondern auch während des Programms aufgerufen werden, und dann braucht man das schon. Ich mach die Funktion ja nicht aus spaß an der freud *g*



  • Warum keine std::vector?

    class Polygon
    {
    public:
       Polygon (const Vertex *Vertices, int *PIndex, int vertex_count, uchar color) 
    
       //Copy-Kontruktor
       Polygon (const Polygon &p);
    
       // Destructor und Init entfallen
       ...
    
    private:
       std::vector<Vertex> Vertices;
       std::vector<int> PointsIndex;
       uchar Color;
    };
    
    Polygon::Polygon (const Polygon &p)
      : Vertices(p.Vertices),
        PointsIndex(p.PointsIndex),
        Color(p.Color)
    {
    }
    
    Polygon::Polygon (const Vertex * vertices, int * PIndex, int vertex_count, uchar color)
     : Vertices (vertices, vertices+vertex_count), PointsIndex (PIndex, PIndex+vertex_count), Color (color)
    {
    }
    


  • dann müsste ich hunderte Zeilen code ändern 👎
    Außerdem will ich verstehen, warum das nicht funktioniert, und nicht einfach vom fehler weglaufen.

    Um noch mal auf strlen zurückzukommen: Weiß jemand, ob bzw. wo das in new bzw. delete benutzt wird? Es kommt mir sehr suspekt vor, dass ich nach dem abbruch des Programms direkt die assembly von strlen bekomme.



  • randa schrieb:

    dann müsste ich hunderte Zeilen code ändern 👎
    Außerdem will ich verstehen, warum das nicht funktioniert, und nicht einfach vom fehler weglaufen.

    Um noch mal auf strlen zurückzukommen: Weiß jemand, ob bzw. wo das in new bzw. delete benutzt wird? Es kommt mir sehr suspekt vor, dass ich nach dem abbruch des Programms direkt die assembly von strlen bekomme.

    Der Code hier scheint mir ok zu sein. Da muß der Fehler woanders liegen. Ich würde das mit valgrind analysieren, aber du scheinst Windows zu benutzen.

    Andererseits, was spricht dagegen den Code kürzer, einfacher und weniger fehleranfällig zu machen, auch wenn Code umgeschrieben werden muß. Die Zeit ist meiner Meinung nach gut investiert, da man bei der Fehlersuche sehr viel mehr Zeit spart.



  • Um die Verwirrung komplett zu machen: Der Fehler tritt nur auf, wenn ich 32 bit farbtiefe einstelle. Mit 8 Bit passiert nichts, außer das beim regulären ende des Programms beim Konstruktor eine Ausnahme bzw. Fehler geschieht.
    Die Initialisierung dieses Polygon-Arrays ist bei beiden farbtiefen exakt gleich, und der Fehler kommt auch an der gleichen stelle

    Face SurfaceDef[6]= { Face (points, p1, fsize, 220),
    		      Face (points, p2, fsize, 150),
    		      Face (points, p3, fsize, 200),
    		      Face (points, p4, fsize, 250),
    		      Face (points, p5, fsize, 200),
    		      Face (points, p6, fsize, 255) };
    

    Die letzten Werte (die Zahlenwerte) sind zulässige Werte und ändern sich nicht. Das sind auch die Farbwerte.

    Mich überrascht mittlerweile gar nichts mehr, aber ich bin ziemlich angepisst vom VC++net Compiler. Der lässt jeden möglichen Scheiß mit Arrays durchgehen (z.B. weit über die Arraylänge hinaus zu schreiben, um nur mal ein Beispiel zu geben). Möglicherweise steckt der Fehler wirklich ganz wo anders, und der compiler beschwert sich erst jetzt. Fürn Arsch 👎

    Edit: Wusste gar nicht das hier automatisch zensiert wird 😃



  • randa schrieb:

    Mich überrascht mittlerweile gar nichts mehr, aber ich bin ziemlich angepisst vom VC++net Compiler. Der lässt jeden möglichen Scheiß mit Arrays durchgehen (z.B. weit über die Arraylänge hinaus zu schreiben, um nur mal ein Beispiel zu geben). Möglicherweise steckt der Fehler wirklich ganz wo anders, und der compiler beschwert sich erst jetzt. Fürn *****

    Auch wenn ich den VC++net nicht benutze, da kann der doch nichts für. Man soll einfach keine Arrays mehr benutzen, es sei denn jemand hält einem die Schrottflinte an den Kopf und falls dieser jemand nervöse Zuckungen bekommt, wenn man keine Arrays benutzt. Und selbst dann gehen oft die Zuckungen weg, wenn man std::vector benutzt.



  • Also für mich scheint der Fehler in einem Namenskonflikt zu liegen.

    void Polygon::Init (const Vertex *Vertices, int *PIndex, int vertex_count, uchar color)
    

    In dieser Funktion gibt es 2x Vertices, 1x der Parameter und 1x der Member. Was nun? Und vertices wird da benutzt, aber wo kommt das denn her? Genau aus solchen Gründen verwenden viele Programmierer eine spezielle Namensgebung für Member. Ich hab mir mittlerweile den nachführenden Unterstrich angewöhnt (zB vertices_) und muss sagen, dass mir das recht gut gefällt (im Gegensatz zu m_).

    randa schrieb:

    Mich überrascht mittlerweile gar nichts mehr, aber ich bin ziemlich angepisst vom VC++net Compiler. Der lässt jeden möglichen Scheiß mit Arrays durchgehen (z.B. weit über die Arraylänge hinaus zu schreiben, um nur mal ein Beispiel zu geben).

    Das liegt nicht am Compiler, sondern an deiner Unfähigkeit 😉 . Um solche Sachen zu vermeiden, kann man sich einer Array Klasse bedienen. Um zu sehen wie sowas ungefähr ausschaut, da kannst du dir ja mal boots::array reinziehen. Da kannst du dir dann Debug Nachrichten reinmachen und weisst sofort wo ein ungültiger Zugriff stattgefunden hat.

    randa schrieb:

    Mit 8 Bit passiert nichts, außer das beim regulären ende des Programms beim Konstruktor eine Ausnahme bzw. Fehler geschieht.

    Ich möchte nicht wissen wie dein Programm ausschat, wenn was passiert. 😮



  • groovemaster2002 schrieb:

    Also für mich scheint der Fehler in einem Namenskonflikt zu liegen.

    Ne, in wirklichkeit heißt der parameter nämlich *vertices. Und bevor ich ungarische notation verwende, stürz ich mich lieber von der brücke 🙄 😉

    Das liegt nicht am Compiler, sondern an deiner Unfähigkeit 😉 . Um solche Sachen zu vermeiden, kann man sich einer Array Klasse bedienen. Um zu sehen wie sowas ungefähr ausschaut, da kannst du dir ja mal boots::array reinziehen. Da kannst du dir dann Debug Nachrichten reinmachen und weisst sofort wo ein ungültiger Zugriff stattgefunden hat.

    Array-Klasse=Überflüssig weil ich std::vector habe. Warum zweimal machen?
    Unfähigkeit, nein. Das oben beschriebene ist mir mal rein aus versehen passiert (250 positionen über den array hinaus gelesen). Das hat zur Laufzeit null probleme gemacht. Nur die Performance ist 90% eingebrochen. Wer würde von so einem Performanceeinbruch auf eine (theoretische) acces violation schließen, die jedoch gar nicht gemeldet wurde?

    Ich möchte nicht wissen wie dein Programm ausschat, wenn was passiert. 😮

    Wenn was passiert, dann nur mathematische fehler bzw. fehler in algorithmen. Anders als du denkst, ist mein Programm stabil und relativ performant. Den 32bit-Modus implementiere ich gerade, deshalb ist das noch nicht ausgereift.



  • randa schrieb:

    Edit: Abgesehen davon soll die Funktion Init nicht nur vom Kontrsuktor, sondern auch während des Programms aufgerufen werden, und dann braucht man das schon. Ich mach die Funktion ja nicht aus spaß an der freud *g*

    Du sollst auch nicht die delete[] weglassen, sondern die if.



  • Ach ja?

    Vertex *Vertices=new Vertex[10];
    //...
    //Aufruf von init ohne die ifs
    Vertices=new Vertex[300];
    

    das sieht mir nach einem speicherleck aus 🙄
    Oder kannst du mir sagen, wie ich die alten daten löschen soll, auf die 'Vertices' jetzt nicht mehr zeigt. Adresse raten? *g*

    Die Init Funktion soll sowohl im uninitialisierten Status Daten zuweisen können wie im Initialisierten Status.



  • Stell dich doch nicht so blöd an! Statt

    if (!Vertices) Vertices=new Vertex[VertexCount];
        else
        {
            delete[] Vertices;
            Vertices=new Vertex[VertexCount];
        }
    

    schreibst du

    delete[] Vertices;
        Vertices=new Vertex[VertexCount];
    


  • keine lust :p



  • Stell dich doch nicht so blöd an!

    Was ist denn das für ein Ton? So motiviert man nicht einmal sich selbst! 😉 😃



  • helpful schrieb:

    Was ist denn das für ein Ton?

    Nun ja, aber im Grunde hat Ringding schon Recht. 😃

    randa schrieb:

    Ne, in wirklichkeit heißt der parameter nämlich *vertices.

    Dann möchte ich dich gerne nochmal auf das gute alte Copy & Paste hinweisen. 😉

    randa schrieb:

    Und bevor ich ungarische notation verwende, stürz ich mich lieber von der brücke

    Wer hat denn hier was von ungarischer Notation erzählt?

    randa schrieb:

    Array-Klasse=Überflüssig weil ich std::vector habe. Warum zweimal machen?

    OK, für dich vielleicht überflüssig, für mich jedenfalls nicht. std::vector ist ausserdem mehr als nur eine einfache Kapselung eines builtin Arrays und mir daher zu *aufgebläht*. Weiterhin arbeitet std::vector mit dynamischem Speicher und das ist nicht immer gewollt. Warum erst Speicher reservieren, wenn ich nur ein paar Bytes brauche die ich locker auf dem Stack auslagern kann. Sicherlich kann man einen angepassten Allokator schreiben, ich hab aber noch keinen gesehen der das macht. Ausserdem hab ich keine Lust in den std Headern rumzupfuschen, wenn ich mir irgendwo Log Nachrichten einbauen will.

    randa schrieb:

    Unfähigkeit, nein. Das oben beschriebene ist mir mal rein aus versehen passiert (250 positionen über den array hinaus gelesen). Das hat zur Laufzeit null probleme gemacht.

    Schön dass es dir keine Probleme bereitet hat, ich versuche jedenfalls Programme zu schreiben die kein undefiertes Verhalten aufweisen oder *random features* besitzen.



  • Hallo,

    wenn ich mir mal eine kleine Frage erlauben duerfte:

    Warum eine Init-Funktion, wo es doch sowas schoenes wie Konstruktoren gibt?

    mfg
    v R



  • groovemaster2002 schrieb:

    Nun ja, aber im Grunde hat Ringding schon Recht. 😃

    Ja hat er. Ich habe nur vergessen, das ein delete auf null keine probleme macht. Ich habe angenommen das sei unzulässig.
    Jedenfalls schadet das if nicht und von daher ist es wurscht 🙂

    Wer hat denn hier was von ungarischer Notation erzählt?

    m_xxx dinger schauen furchtbar aus und gehören zur ungarischen notation, so wie m_iIndex oder lpddDirectDraw o.ä. Furchtbar.

    Schön dass es dir keine Probleme bereitet hat, ich versuche jedenfalls Programme zu schreiben die kein undefiertes Verhalten aufweisen oder *random features* besitzen.

    Der Kommentar ist überflüssig.
    Ich versuche das nämlich auch. Und: mir gelingt es sogar *g*

    Edit
    @virtuell Realisticer: Die Frage ist nicht erlaubt, denn die Antwort ist schon gefallen.



  • Ah, Init ist public, das uebersah ich.

    mfg
    v R



  • randa schrieb:

    Jedenfalls schadet das if nicht und von daher ist es wurscht

    und redundant

    randa schrieb:

    m_xxx dinger schauen furchtbar aus

    full ack. Ich hab dir aber auch nie geraten sowas zu benutzen. Ich hab lediglich gesagt, dass eine spezielle Namensgebung für Member durchaus sinnvoll sein kann.

    randa schrieb:

    Der Kommentar ist überflüssig.
    Ich versuche das nämlich auch. Und: mir gelingt es sogar *g*

    Da bin ich mir nicht so sicher, sonst gäbe es wohl den Thread nicht. :p

    randa schrieb:

    Leider klappt das nicht (welch überraschung 🙄 )

    Zeugt nicht gerade von einem erfolgverwöhnten Programmierstil.

    Hast du eigentlich deinen Fehler gefunden? Wenn nicht, empfehle ich dir mal deinen Debugger anzuwerfen. Bisher sind deine Fehlerinformationen jedenfalls zu wenig.



  • groovemaster2002 schrieb:

    Da bin ich mir nicht so sicher, sonst gäbe es wohl den Thread nicht. :p
    [...]
    Zeugt nicht gerade von einem erfolgverwöhnten Programmierstil.

    Doch, denn mein Software Renderer ist bald fertig :p

    Hast du eigentlich deinen Fehler gefunden?

    Jepp. Es lag tatsächlich nicht an diesem Code, sondern an der Intitalisierung der 32Bit Farbpalette.

    Danke für die Hilfe Leute.


Anmelden zum Antworten