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

06.02.2010, 20:38

std::list und Zugriffsverletzung

Aloha,

frei nach dem Motto "Fragen ist menschlich", frage ich mal wieder.

Fehlermeldung:

Zitat

Eine Ausnahme (erste Chance) bei 0x01363a2d in BBAW_v3.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000004.
Unbehandelte Ausnahme bei 0x01363a2d in BBAW_v3.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000004.


Quellcode:
EventManager.hpp

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
#ifndef EVENTMANAGER_HPP
#define EVENTMANAGER_HPP

#include <list>
#include <SFML/Window.hpp>
#include "EventObserverInterface.hpp"

class EventManager
{
private:
    std::list<EventObserverInterface*> observerList;


public:
    EventManager();
    ~EventManager();

    void attachObserver(EventObserverInterface& observer);
    void dettachObserver(EventObserverInterface& observer);

    void notify(sf::Event& event);
};

#endif


EventManager.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
#include "EventManager.hpp"


EventManager::EventManager()
{
}
EventManager::~EventManager()
{
}
void EventManager::attachObserver(EventObserverInterface& observer)
{
    observerList.push_back(&observer); //Fehler!

}
void EventManager::dettachObserver(EventObserverInterface& observer)
{
    observerList.remove(&observer);
}

void EventManager::notify(sf::Event& event)
{
    std::list<EventObserverInterface*>::iterator it(observerList.begin());

    for(;it != observerList.end(); ++it)
    {
        (*it)->GetEvent(event);
    }
}


EventObserverInterface.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#ifndef EVENTOBSERVERINTERFACE_HPP
#define EVENTOBSERVERINTERFACE_HPP

#include <SFML/Window.hpp>

class EventObserverInterface
{
public:
    virtual void GetEvent(const sf::Event& event) = 0;
};

#endif


IntroEventObserver.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#ifndef INTROEVENTOBSERVER_HPP
#define INTROEVENTOBSERVER_HPP

#include "EventObserverInterface.hpp"

class IntroEventObserver: public EventObserverInterface
{
public:
    void GetEvent(const sf::Event& event);
};

#endif


IntroState.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
IntroState::IntroState()
{
    Application::GetInstance().GetImageManager().Load("img/logo.png");
    logo.SetImage(Application::GetInstance().GetImageManager()["img/logo.png"]);

    Application::GetInstance().GetEventManager().attachObserver(eventObserver); //Verursacht den Fehler

}



Für hilfe immer dankbar.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

06.02.2010, 20:49

hast schon den debugger ausprobiert? wie wärs wenn du uns verrätst wann der fehler auftritt.
wenn du eine funktion in der basisklasse als virtuell deklarierst sollte in der abgeleiteten klasse auch virtual davor stehen. macht leistungstechnisch zwar keinen unterschied aber man sieht sofort, dass es eine virtuelle methode ist.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

06.02.2010, 20:53

Für die Information wann der Fehler auftritt habe ich einen Kommentar in den Code geschrieben. :)

Stimmt das mit dem virtual hast du schon gesagt. Habe ich vergessen, entschuldige bitte.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

06.02.2010, 21:08

Den virtuellen Destruktor von EventObserverInterface nicht vergessen!

Und der Fehler hat nichts mit der Liste zu tun, sondern du hast wahrscheinlich kein gültiges Objekt. Hier:

C-/C++-Quelltext

1
Application::GetInstance().GetEventManager().attachObserver(eventObserver);

GetEventManager gibt dir wahrscheinlich 0 zurück.

So etwas siehst du aber sehr gut mit einem Debugger.

5

06.02.2010, 21:14

Zitat von »"drakon"«

Den virtuellen Destruktor von EventObserverInterface nicht vergessen!

Und der Fehler hat nichts mit der Liste zu tun, sondern du hast wahrscheinlich kein gültiges Objekt. Hier:

C-/C++-Quelltext

1
Application::GetInstance().GetEventManager().attachObserver(eventObserver);

GetEventManager gibt dir wahrscheinlich 0 zurück.

So etwas siehst du aber sehr gut mit einem Debugger.


Doch Objekt ist gültig. Springt im Debugger ja auch rein. Der Fehler wird ja erst nach push_back() erzeugt. Habe die Line nur kommentiert damit man sieht wo es aufgerufen wird mit was.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

06.02.2010, 21:18

Dann ist halt dein singleton bereits falsch. Du hast einen Speicherzugriffsfehler und der kommt nicht von einem push in eine std::list.

Du kannst durchaus eine Funktion mit einem 0-Zeiger aufrufen und sofern du auf keine Daten zugreifst, dann passiert wahrscheinlich auch nichts, aber da die Liste ein Datenmember ist, was noch keinen Speicher hat kommt dann der Laufzeitfehler.

Hab sogar mal was darüber geschrieben:
http://drakon.ch/?id=&offset=2&mobile=0&show_entry=76

7

06.02.2010, 21:27

Application.hpp

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
#ifndef APPLICATION_HPP
#define APPLICATION_HPP

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "GameStateManager.hpp"
#include "ImageManager.hpp"
#include "SoundManager.hpp"
#include "EventManager.hpp"

class Application
{
private:
    sf::RenderWindow screen;
    sftools::ImageManager imgm;
    sftools::SoundManager sfxm;
    GameStateManager gsm;
    EventManager evtm;

public:
    static Application& GetInstance() { static Application app; return app; }
    
    sftools::ImageManager& GetImageManager();
    sftools::SoundManager& GetSoundManager();
    sf::RenderWindow& GetWindow();
    GameStateManager& GetGameStateManager();
    EventManager& GetEventManager();

    void input();
    void logic();
    void render();

protected:
    Application();

    Application(const Application& copy) {};
};

#endif


Application.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
#include "Application.hpp"

Application::Application()
{
    screen.Create(sf::VideoMode(800, 600),"TestTitle");
}

sftools::ImageManager& Application::GetImageManager()
{
    return imgm;
}
sftools::SoundManager& Application::GetSoundManager()
{
    return sfxm;
}
sf::RenderWindow& Application::GetWindow()
{
    return screen;
}
GameStateManager& Application::GetGameStateManager()
{
    return gsm;
}
EventManager& Application::GetEventManager()
{
    return evtm;
}

void Application::input()
{
    sf::Event event;
    while(GetWindow().GetEvent(event))
    {
        if(event.Type == sf::Event::Closed)
            GetWindow().Close();

        GetEventManager().notify(event);
    }
    GetGameStateManager().GetGameState()->input();
}
void Application::logic()
{
    GetGameStateManager().GetGameState()->logic();
}
void Application::render()
{
    GetGameStateManager().GetGameState()->render();
    GetWindow().Display();
}


Ich will wirklich nicht als dumm erscheinen, aber wo liegt den hier bitte der Fehler?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

06.02.2010, 21:37

Das sieht eigentlich in Ordnung aus.

Woher kommt denn eventObserver?

Wie gesagt schau mit dem Debugger was für eine Variable denn so aussieht:

Zitat

0x00000004

9

06.02.2010, 21:40

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
#ifndef INTROSTATE_HPP
#define INTROSTATE_HPP

#include <SFML/Graphics.hpp>
#include "GameStateInterface.hpp"
#include "IntroEventObserver.hpp"

class IntroState: public GameStateInterface
{
private:
    IntroEventObserver eventObserver;
    sf::Sprite logo;
    sf::String copyright;

public:
    IntroState();
    ~IntroState();

    void input();
    void logic();
    void render();
};

#endif


Wie ich sowas im Debugger finde weiss ich noch nicht, aber ich probiere es mal. Vllt findet jmd. die Lösung schon vorher. ;)

Edit: Den Debugger durchsucht. Keine Variable hat den Wert. Wenn ich mich in <list> befinde sind alles Variablen ungültig.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

06.02.2010, 22:25

Mach mal ein Screenshot von den lokalen Variablen und Stacktrace, wenn der Fehler passiert.

Werbeanzeige