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

24.04.2012, 01:11

SFML 2 Zugriffsverletzung während des Programmverlassens

Ich wollte mir mal SFML angucken und bin schon auf das erste Problem gestoßen als ich ein Titel angeben wollte da SFML nur 1 Byte Zeichen animmt....
Das Probelm konnte ich mit der sf::String Klsse lösen allerdings funktioniert das ganze beim verlassen des Gültigkeitsbereichs nichtmehr. Sobald Str zerstört wird bekomme ich eine Zugriffsverletzung.

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
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow )
{
    sf::String sfStr("My Application");
    std::string Str = sfStr.toAnsiString();

    sf::RenderWindow window(sf::VideoMode(600,400), "");
    window.setTitle(Str);
    
    sf::Text text("First Time Test Text");

    while(window.isOpen())
    {
        sf::Event event;
        while(window.pollEvent(event))
        {

            if(event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(text);
        window.display();
    }

    window.setTitle("");

    return 0;
}


Das Probelm muss an der .ToAnsiString Funktion liegen da der Fehler im Destruktor des std::string auftritt. Wenn ich das window.SetTitle() nicht ans Ende setzte bekomme ich einen Fehler in der mlock.c nach "EnterCriticalSection( _locktable[locknum].lock );" in "void __cdecl _lock (int locknum)". Mit der SetTitle Zeile kommt die Zugriffsverletzung in der free.c bei "retval = HeapFree(_crtheap, 0, pBlock);" in "void __cdecl _free_base (void * pBlock)". Liegt es vielleicht daran das Str mit sfStr verknüpft wird und Str nicht gelöscht werden kann weil die Ressourcen zu sf Str gehören?


C-/C++-Quelltext

1
2
3
    std::string Str;
    sf::String sfStr("My Application");
    Str = sfStr.toAnsiString();

Gibt komischerweise eine Exeption in xlock.cpp bei der Zuweisung von Str. Dabei sollte es doch keine Probleme bei einer Zuweisung von std::string zu std::string geben...
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.04.2012, 02:45

Verwendest du die SFML als dll? Das Problem ist nämlich wohl, dass der Buffer für den String in der dll erzeugt und in der exe freigegeben wird (bzw. umgekehrt) und dll und exe unterschiedliche Heaps haben...C++ in einem dll Interface ist eine sehr problematische Sache.
Wofür genau brauchst du denn den sf:: String da, könntest du nicht einfach nur mit std::string arbeiten?

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

3

24.04.2012, 16:11

Der Destruktur/Konstruktor von sf::String sind in der selben DLL, das ist nicht das Problem (wäre es das, wären DLLs in C++ völlig unbenutzbar ;)). Das Problem ist wohl eher der Defautl-Font-Crash: https://github.com/LaurentGomila/SFML/issues/59

4

24.04.2012, 18:26

Ok vielleicht sollte ich doch auf SFML verzichten und mir ein anderes Framework angucken, hat jemand Erfahrungen mit SDL?
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

5

24.04.2012, 18:33

Vielleicht solltest du mal eine neue Version ausprobieren...

Freundliche Grüße
Stazer

6

24.04.2012, 18:37

Ich habe den release candidate von SFML 2 genommen der sollte eigentlich aktuell sein^^
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

7

24.04.2012, 18:39

SDL ist schlecht. Für nen Pong reicht sie, aber alles andere kannst du (so ziemlich) vergessen.
Bleib bei der SFML. nur weil eine sache verbuggt ist uss man nicht gleich alles hinschmeißen. Lade einfach eine andere Font und das Problem sollte gelöst sein.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

8

24.04.2012, 18:42

Mach´s doch statisch. 8|

MfG
Check

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

9

24.04.2012, 18:43

Man muss nicht mal eine eigene Font laden, nur die Default-Font selbst darf nicht "gezeichnet" werden, eine Kopie davon aber sehr wohl.

C-/C++-Quelltext

1
2
3
sf::Font font(sf::Font::getDefaultFont());
sf::Text myText("Default-Font ohne Absturz, aber auch ohne Default.");
myText.setFont(font);

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

10

24.04.2012, 18:44

Zitat

Mach´s doch statisch. 8|

MfG
Check


Damit hat es doch nichts zu tun!
Lesen, dann aufregen.
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Werbeanzeige