Hallo,
Ich schreibe zurzeit an einem Programm zur Darstellung von Wellen in C++ mit der Entwicklungsumgebung Visual C++ 2010 Express und der Bibliothek SFML, und habe dabei das Problem, dass ich, wenn ich das Fenster schließe, eine Fehlermeldung erhalte. Ich benutze dabei die Debug Version.
Die Fehlermeldung lautet folgendermaßen:
Debug Assertion Failed!
Program: <Verzeichnis und Dateiname des Programms>
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
EXPRESSION: _BLOCK_TYPE_IS_VALID (pHead->nBlockUse)
Habe schon bei Google nach diesem Problem gesucht, und gefunden, dass dieser Fehler wohl auftritt, wenn man versucht, Speicher freizugeben, der bereits freigegeben wurde.
Ich habe eine Klasse die heißt "Application", dort reserviere ich auch manuell Speicher. Und zwar definiere ich erst den Zeiger für die Welle mit dem new Operator, nachdem ich den Benutzer nach den Werten für die Welle gefragt habe, vorher ist er NULL. Jedoch gebe ich im Dekonstruktor der Klasse "Application" auch den Speicher wieder frei, und prüfe auch extra, ob der Zeiger nicht NULL ist.
Ich habe auch testweise die update- und render-Funktion der Application, welche bei jedem Durchgang der while-Schleife ausgeführt werden (die while-Schleife wird solange ausgeführt, wie das Fenster geöffnet ist) auskommentiert, dann gab es dasselbe Verhalten.
Wenn ich die "askForValues" Funktion des "application" Objekts auskommentiere, in der ganz am Anfang des Programms, vor der Erstellung des Fensters, die Werte für die Welle vom Benutzer in der Konsole abgefragt werden, stürzt das Programm nicht ab.
Wenn ich jedoch in der "askForValues" Funktion alles bis auf die Erstellung der Welle mit dem new-Operator auskommentiere, tritt der beschriebene Fehler auf. Also scheint es irgendein Problem mit der Speicherreservierung und Speicherfreigabe zu geben.
Anbei ist der Quelltext der für dieses Problem wichtigsten Funktionen:
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
41
42
43
44
45
46
47
48
49
50
51
|
#include <SFML\Graphics.hpp>
#include "Application.hpp"
#include "Global.hpp"
int main ()
{
Application application;
bool timeRunning = false;
application.askForValues ();
sf::RenderWindow window (sf::VideoMode (SCREENWIDTH, SCREENHEIGHT, 32), "Wellen");
sf::Clock clock;
float time = 0.0f;
float frametime = 0.0f;
while (window.isOpen ())
{
sf::Event windowEvent;
while (window.pollEvent (windowEvent))
{
if (windowEvent.type == sf::Event::Closed)
window.close ();
// wenn Leertaste gedrückt wird, Programm fortsetzen / pausieren
else if (windowEvent.type == sf::Event::KeyPressed)
{
if (windowEvent.key.code == sf::Keyboard::Space)
timeRunning = !timeRunning;
}
}
window.clear (sf::Color::White);
frametime = clock.getElapsedTime().asSeconds();
if (timeRunning)
time += frametime;
clock.restart ();
application.update (time, frametime);
application.render (&window);
window.display ();
}
return 0;
}
|
askForValues Funktion der Application Klasse
(reduziert auf vorhandenes Problem, Rest wurde ja wie gesagt testweise auskommentiert und hat den Fehler nicht behoben):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
void Application::askForValues ()
{
float amplitude = 1.0f, frequency = 1.0f, velocityOfPropagation = 1.0f;
float xZoom = 250.0f, yZoom = 250.0f, timeZoom = 1.0f;
int leftOffset = 100, bottomOffset = 100, rightOffset = 100, topOffset = 100;
// Welle definieren
m_pWave = new Wave (amplitude, frequency, velocityOfPropagation,
xZoom, yZoom, timeZoom,
leftOffset, bottomOffset, rightOffset, topOffset);
// Koordinatensystem definieren
m_pCoordinateSystem = new CoordinateSystem (xZoom, yZoom, timeZoom,
leftOffset, bottomOffset, rightOffset, topOffset);
m_pCoordinateSystem->create ();
}
|
Dekonstruktor der Application Klasse:
|
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
|
Application::~Application ()
{
// Speicher freigeben
if (m_pWave != NULL)
{
delete (m_pWave);
m_pWave = NULL;
}
// Text für FPS Anzeige, Typ: sf::Text*
if (m_pFPSText != NULL)
{
delete (m_pFPSText);
m_pFPSText = NULL;
}
if (m_pCoordinateSystem != NULL)
{
delete (m_pCoordinateSystem);
m_pCoordinateSystem = NULL;
}
}
|
In der Klasse CoordinateSystem wird auch Speicher auf dieselbe Methode reserviert und freigegeben, könnte das evtl. auch die Ursache sein?
Vielen Dank schonmal im voraus.