Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.04.2015, 17:15

Memory leak mit SDL_TTF

Hallo Spieleprogrammierer!

Leider hat sich in meinen Code ein "Memory Leak" eingeschlichen. Gefunden habe ich es denke ich schon, nur wie ich es beheben kann, das ist eine andere Sache....
Ich habe in meinem kleinen Spielchen ein paar Texte, die dauerhaft aktualisiert werden (Stoppuhr etc.).

Zum Festlegen des Textes verwende ich die SDL_Funktion:

C-/C++-Quelltext

1
SDL_Surface* Text = TTF_RenderText_Blended(font, sText.c_str (), textColor); SDL_BlitSurface (Text, 0, Screen, &TextPosition);

Wobei sich sText.c_str () dauerhaft ändert da diese Funktion in einer while-Schleife immer wieder aufgerufen wird.

Nun habe ich in meinem Destruktor der Klasse Text (diese Klasse rufe ich immer wenn Texte benötigt werden auf) auch stehen:

C-/C++-Quelltext

1
TTF_CloseFont(font);    SDL_FreeSurface (Text);    SDL_FreeSurface (Screen);


Das Problem müsste glaube ich bei font liegen. Ich denke, dass ich da nach jedem mal ändern des Textes (s.Text.c_str ()) Speicher wieder freigeben müsste...

Den ganzen Code brauche ich glaube ich nicht posten, da dieser vollkommen unübersichtlich und 3000000 Seiten lang wäre... :)
Vielleicht ist der Fehler ja in diesen paar Zeilen...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Parod0ntos3« (11.04.2015, 17:45)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

11.04.2015, 17:26

Die TTF_Font* musst du nur schließen und neu öffnen, wenn du eine andere Schriftart willst, nicht wenn sich der Inhalt des Textes ändert. Am Ende solltest du das natürlich auch machen. ;)
Kann es sein, dass du die SDL_Surface 'text' nicht freigibst? Ich sehe in deinem Beispiel-Code nämlich SDL_FreeSurface(Text); und nicht SDL_FreeSurface(text); (kleingeschrieben). Oder ist das ein Tippfehler? Ansonsten bräuchte ich doch mehr Code.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

11.04.2015, 18:06

Leider nur ein Tippfehler hier im Forumseintrag :/
Aber hier ist der Fehler denke ich.

Ich habe eine eigene Klasse für Texte gemacht. Und dort wird erst im Destruktor der screen Text freigegeben. Wahrscheinlich müsste dieser screen nach jedem mal rendern freigegeben werden, oder?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

11.04.2015, 19:06

Kann ich nicht sagen. Kommt auf deinen Code an. Die text SDL_Surface muss nach jedem rendern freigegeben werden.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

12.04.2015, 08:59

Ah und genau da ist der Fehler ;)

Ich dachte, dass das im Destruktor reicht, aber der wird natürlich erst beim Beenden des Programms aufgerufen... Danke, "Die text SDL_Surface muss nach jedem rendern freigegeben werden." hat mir weitergeholfen :)

Psyco001

Frischling

Beiträge: 54

Wohnort: Berlin

  • Private Nachricht senden

6

12.04.2015, 11:10

Wie Architekt bereits geschrieben hat kommt es auf deinen Code an.
Und da Ich meine gelesen zu haben das du dafür eine Klasse geschrieben hast noch ein hinweis von mir:
anstatt jede runde den Text erneut in ein Surface zu Rendern wäre es besser nur nach einem update/ändern des Textes das Surface zu löschen und neu zu Rendern.

Werbeanzeige