dynamischer Speicher



  • Hallo,
    ich habe ein Problem mit den new und delete Operatoren:
    Der Spielablauf läuft "normal" in der PeekMessage Funktion im else-Teil ab.
    Ziemlich am Ende der Funktion gibt es eine if-Abfrage, wenn ja: soll deleted werden und der Zeiger soll nun auf ein neuen Speicherbeireich zeigen:

    /////////////////////////////////////////////
    //Definitionsteil:

    CBuchstabe *pBuchstabe = new CBuchstabe;
    flag = 0;

    //Nachrichtenschleife:
    if(PeekMessage())
    {

    }
    else
    {
    BeginScene();

    if (flag)
    {
    pBuchstabe = new CBuchstabe;
    flag = 0;
    }
    .........
    .........
    pBuchstabe -> func();

    ..........
    if ( irgendwas)
    {
    delete pBuchstabe;
    flag = 1;

    }

    EndScene();
    }

    ////////////////////////////////////

    die Frage ist, habe ich hier etwas mit dem new und delete Operatoren falsch gemacht, oder ist das im Prinzip richtig und der Fehler liegt irgendwo anders im Programm? 😕

    vielen dank



  • Tahir schrieb:

    die Frage ist, habe ich hier etwas mit dem new und delete Operatoren falsch gemacht, oder ist das im Prinzip richtig und der Fehler liegt irgendwo anders im Programm? 😕

    das könnte man dir vermutlich wesentlich einfacher beantworten, wenn du den fehler überhaupt erstmal beschreiben würdest, denn "ich hab ein problem" hilft bei der fehlersuche irgendwie nicht so recht weiter.

    bestenfalls stellt sich allerdings die frage, wozu du überhaupt das flag mitschleifst? ein zeiger ist in der hinsicht sein eigenes flag.

    if (!pBuchstabe) pBuchstabe=new CBuchstabe;
    ...
    delete pBuchstabe;
    pBuchstabe=0;



  • CBuchstabe ?!
    Du organisierst doch wohl nicht einzelne Bytes in jeweils einem eigenen Objekt oder ?! 😕
    Was soll das denn letztendlich werden ? Ein Dynamisches Array für Zeichenfolgen oder wie ?



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • das Problem ist, dass das Program beim nächsten Aufruf einer Funktion mit dem neuen Zeiger abstürzt!

    pBuchstabe -> func();

    die Fehlermeldung kann ich euch morgen schreiben.

    vielen dank für eure Hilfe



  • Hallo,
    es tritt eine "access violation" auf.



  • wenn ich ein array Anlege funktioniert es. Es soll aber je nach Verlauf des Programms die Anzahl festgelegt werden.

    //definitionsteil:
    CBuchstabe Buchstabe[5];
    int var;

    //Nachrichtenschleife:
    if(PeekMessage())
    {

    }
    else
    {
    BeginScene();

    .........
    .........
    Buchstabe[var].func();

    ..........
    if ( irgendwas)
    {
    var++;
    }

    EndScene();
    }



  • Access Violation deutet meistens darauf hin, dass du auf Speicher zugreifst, der dir entweder nicht gehört, bzw. den du nicht überschreiben darfst.
    Ein Problem könnte hier liegen

    Buchstabe[var].func();
    

    Wenn var zu gross ist, greifst du auf einen Bereich zu, der von Buchstabe nicht mehr abgedeckt wird ➡ undefiniertes Verhalten.
    Prüfe also nochmals deinen Ablauf.

    Nachtrag:
    Benutze in Zukunft bitte Code-Tags.



  • das Problem ist, dass es nur mit der dynamischen Lösung nicht funktioniert. Lege ich aber die größe fest d.h. mit var, dann funktioniert es ja!!

    CBuchstabe Buchstabe[5];
    

    //dieser Weg funktioniert!!

    ich weiß aber vorher nicht wieviel Objekte ich brauchen werde. Deshalb wollte ich es dynamisch lösen. Ich habe einfach nur an der Stelle an der das Array um eins erhöht (var++) wird, den Speicherbereich auf den der Zeiger zeigt deleted und einen neuen erzeugt (siehe erster Beitrag).



  • Tja, hat wohl nicht ganz geklappt mit den Code-Tags. 🙂 Da du registriert bist, kannst du übrigens den Beitrag auch nachträglich editieren.

    Zum Thema, mit

    CBuchstabe *pBuchstabe = new CBuchstabe;
    

    reservierst du lediglich Speicher für ein! CBuchstabe Objekt. Dh du darfst lediglich mit

    pBuchstabe[0]
    

    darauf zugreifen. Wenn du mehr brauchst, musst du das in Arrayform angeben

    CBuchstabe *pBuchstabe = new CBuchstabe[10]; // Speicher für 10 CBuchstabe Objekte reserviert
    //...
    delete[] pBuchstabe;
    

    Wenn du ein dynamisches Array brauchst, dann schau dir auch mal std::vector an.



  • das ist mir klar. Die Idee ist, dass ich anstatt ein vorher angelegtes array um eins zu erhöhen, ein neues Objekt erzeuge.

    Zum Hintergrund: Es handelt sich hierbei um ein Objekt in einem Spiel. Falls das Objekt zerstört wird, soll ein neues initialisiert werden und benutzt werden.
    Eine andere Lösung wäre das alte Objekt weiterhin zu benutzen. Das ist jedoch schwieriger weil dann alle Werte bzw. Variablen zum Objekt wieder zurückgesetzt werden müssen.
    Anstatt alle Werte zurückzusetzen, erzeuge ich einfach ein neues Objekt und benutze die initialisierungs Funktion die ich schon beim ersten Objekt gebraucht habe. Da ich nicht weiß wie oft das geschehen soll habe ich an eine dynamische Lösung gedacht.
    ich kann auch zu Beginn 1000 Objekte in einem array erzeugen und davon ausgehen, dass nicht mehr als 1000 Spiele gespielt werden. Das ist aber eine schlechte Lösung.

    ich bedanke mich aufjedenfall für eure Mühe


Log in to reply