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

22.07.2013, 14:35

Assert-fehler?

Hey ihr Spieleprogrammierer,

ich bekomme jedes mal wenn ich mein Programm schließe folgende Expression:

_BLOCK_TYPE_IS_VALID(pHeap->nBlockUse)

Da google mir sagte das ich wohl irgendwo ein Memoryleak haben wollte habe ich das mit _CrtCheckMemory() geprüft und 1 zurückbekommen, also habe ich mich auf die Suche nach dem Leak gemacht. Nach 2 Stunden suche bin ich Mental und Hitzebedingt total zerfressen und hoffe jetzt hier auf Hilfe.

Mein Programm umfasst eine Klasse zum laden von Sprites und die main.cpp welche ein Surface besitzt mit dem ich arbeite und welches ich ausgeben lasse.

CSprite.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include <SDL.h>
#include <string>
class CSprite
{
private:
    SDL_Rect position;
    SDL_Surface *display;
public:
    int moveSprite();
    void drawSurface(SDL_Surface* source);
    CSprite(int x, int y, std::string displayPath);
    ~CSprite(void);
};


CSprite.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "Sprite.h"


CSprite::CSprite(int x, int y, std::string displayPath)
{
    display = NULL;
    position.x = x;
    position.y = y;
    
    display = SDL_LoadBMP(displayPath.c_str());
}

void CSprite::drawSurface(SDL_Surface* source)
{
    SDL_BlitSurface(display, NULL, source, &position);
}

CSprite::~CSprite(void)
{
    delete(display);
}


und die main.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <SDL.h>
#include <iostream>
#include "Sprite.h"
#ifdef _WIN32
#undef main
#endif

bool running = true;


int main(int argc, char *argv[]){
    //Initialise
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Surface *screen = NULL;
    CSprite *sprite = new CSprite(10, 10, "background.bmp");

    //Load
    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

    while( running )
    {
        sprite->drawSurface(screen);
        // Update Screen
        SDL_Flip(screen);
        //Checking for Events(case of closing the window)
        SDL_Event event;
        if(SDL_PollEvent(&event))
        {
            if(event.type == SDL_QUIT)
            {
                running = false;
            }
        }
        std::cout << _CrtCheckMemory();
    }
    delete(screen);
    delete(sprite);
    SDL_Quit();
    return 0;
}



Freu mich über jeden Hilfevorschlag.
Mit freundlichen Grüßen
Horius ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

22.07.2013, 14:46

Tausch mal bitte delete(screen) und delete(sprite) und erzähl uns, was passiert.

Übrigens solltest Du Dir eventuell durchlesen, was CrtCheckMemory überhaupt tut und zurück gibt.
http://msdn.microsoft.com/de-de/library/…v=vs.80%29.aspx
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

22.07.2013, 14:55

Die Expression ist trotz tauschen noch da & es ist noch die gleiche.

(Ach das ist ein Assert, das ist jetzt minimal peinlich. :p)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

22.07.2013, 15:00

Und ein SDL-Surface gibt man einfach per delete wieder frei? Sollte man dazu nicht SDL_FreeSurface (http://www.libsdl.org/docs/html/sdlfreesurface.html) benutzen?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

22.07.2013, 15:01

Falls nicht belehre mich eines besseren, ich finde mich gerade in die SDL ein und habs deswegen auf den gewohnten weg versucht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

22.07.2013, 15:01

SDL_FreeSurface (http://www.libsdl.org/docs/html/sdlfreesurface.html)
Wenn es eine Create-Methode gibt, gibt es meist auch eine Free/Delete Methode.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

22.07.2013, 15:03

Funktioniert, danke ;)

8

22.07.2013, 20:24

Du kannst dir ja mal die Definition von SDL_Surface aus Spaß anschauen. Da siehst du, dass es eine Struktur ist, die unter anderem auch einen Zeiger auf den Speicherbereich mit den ganzen Pixels enthält. Wenn du jetzt nur den Speicher von der Surface freigibst, wird nicht automatisch auch der Pixelspeicher freigegeben. Das erledigt aber die FreeSurface-Methode.

Edit: Ich bin mir da selbst nicht ganz sicher. Falls das Blödsinn ist, möge das jemand korrigieren.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dr.hallo« (22.07.2013, 20:32)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

22.07.2013, 20:54

Das ist richtig. SDL_FreeSurface gibt den Pixel Speicher frei und dann den Speicher von SDL_Surface.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige