C++ probleem bij runnen

Status
Niet open voor verdere reacties.

MrRock

Gebruiker
Lid geworden
22 jan 2007
Berichten
5
Hallo,

Ik ben bezig met een spel te maken en zit nu met een probleem, waar ik niet uit kom.

Ik wil aan alle kanten planes gaan plakken om een 'wereld' te creeeren, maar wanneer ik
mijn planes en textures voor front, back, right en left wil aanmaken gaat het fout. Het compilen geeft geen enkel probleem, maar zodra ik ga runnen krijg ik een foutmelding.

Hieronder de code van level1.h:
Code:
#pragma once

#include <string>
#include "level.h"

class Application;
class PlaneEntity;
class BlockEntity;
class KartEntity;
class TextureManager;
class Texture;
class EntityManager;
class InputManager;

class Level1
	
{
private:
	std::string name;
	
	//Lijst met objecten die gebruikt worden in dit levl
	PlaneEntity * planeEntity;
	BlockEntity * blockEntity;
	KartEntity * kartEntity;

                Application * application;

	Texture * texture;

                // het betreft dit gedeelte
	Texture * frontTexture;
	Texture * backTexture;
	Texture * leftTexture;
	Texture * rightTexture;

	PlaneEntity * frontPlane;
	PlaneEntity * backPlane;
	PlaneEntity * leftPlane;
	PlaneEntity * rightPlane;
                // einde gedeelte

	EntityManager * entityManager;
	InputManager * inputManager;

	void addKart();
	void addPlane();
	void addBlockObjects();
public:

	Level1(std::string name, Application *app, EntityManager * entityManager, InputManager * inputManager);	
	~Level1(void);
	void setUpLevel();

};

Zodra ik 7 van de 8 benodigde planes en textures uit probleemgebied actief maak(dus bij 1 nog de '//' commentaar tekens ervoor) krijg ik de volgende error:

"Unhandled exception at 0x7c901230 in GameEngine.exe: User breakpoint"

hij gaat terug naar visual studio en komt bij de volgende klasse en methode:
"mlock.c"
Code:
void __cdecl _unlock (
        int locknum
        )
{
        /*
         * leave the critical section.
         */
        LeaveCriticalSection( _locktable[locknum].lock );
}

Wanneer ik alle 8 de planes en textures 'actief' maak krijg ik de volgende fout:

"Unhandled exception at 0x7c812a5b in GameEngine.exe: Microsoft C++ exception: std::bad_alloc @ 0x0012e89c."

en gaat in visual studio naar de volgende klasse en code stuk:
"dbgheap.c"

Code:
#ifdef _MT
            }
            __finally {
                /* unlock the heap
                 */
                _munlock(_HEAP_LOCK);
            }

Ik begrijp niet hoe dit komt, wat dit inhoudt en hoe ik dit kan oplossen. Aangezien ik in een header file als level.h gemakkelijk 12 planes en textures kan zetten zonder fouten bij runnen.

Ik hoop dat iemand een oplossing voor mijn probleem weet!
 
Kan het zijn dat je een library gebruikt die met de Multithreaded Debug Dll/Library gelinkt is en je zelf de niet-multithreaded versie gebruikt? Zo ja, dan misschien alleen even je linker instellingen aanpassen
 
Kan het zijn dat je een library gebruikt die met de Multithreaded Debug Dll/Library gelinkt is en je zelf de niet-multithreaded versie gebruikt? Zo ja, dan misschien alleen even je linker instellingen aanpassen

Ik ben niet echt een expert in c++ en al helemaal niet in visual studio, dus ik begrijp niet helemaal wat je bedoelt. Het rare is namelijk wanneer ik van 2 van de acht commentaar maak ik geen problemen heb, vanaf zeven zonder commentaar krijg ik dus een fout. dus bijvoorbeeld deze werkt wel:
Code:
	Texture * frontTexture;
	Texture * backTexture;
	Texture * leftTexture;
	Texture * rightTexture;

	PlaneEntity * frontPlane;
	PlaneEntity * backPlane;
	//PlaneEntity * leftPlane;
	//PlaneEntity * rightPlane;
 
ik ken niks van visual studio, maar wel c++

Wat ik vreemd vind is dat je 2 verschillende foutmeldingen krijgt. Maar goed, hier krijg je wat ik uit de foutmeldingen kan afleiden:
7used - 1comment
Code:
"Unhandled exception at 0x7c901230 in GameEngine.exe: User breakpoint"
Hieruit kan ik niks opmaken :p maar echter wel uit het vervolg dat je postte.

Van mlock.c vermoed ik dat mlock staat voor 'memory lock', mede doordat ie naar de functie LeaveCriticalSection verwijst.
Een beetje uitleg over een 'critical section' , als je wil kan je deze uitleg overslaan...
Code:
Het gebruik van een critische sectie maakt het mogelijk dat verschillende threads/objecten met elkaar communiceren en/of data delen. Elk object krijgt zijn eigen adresblok in het geheugen toegewezen. Een critische sectie is een blok van het geheugen waar data voor alle objecten staan. Om te verhinderen dat deze data door 2 objecten gelijktijdig kan aangepast worden (wat tot fouten kan leiden), is deze sectie 'gelockt' (afgesloten). Wanneer een object data in de sectie moet aanpassen, vraagt het een lock op de sectie aan. Als de sectie vrij is, wordt deze exclusief aan dat ene object toegewezen. Als het object klaar is met zijn aanpassingen kan het dat geheugen weer beschikbaar maken dmv een release/unlock uit te voeren.

Aangezien het over gemeenschappelijke data gaat, kan het zijn dat er mss iets misloopt met een static datamember ?

8used - 0 commented
Code:
Unhandled exception at 0x7c812a5b in GameEngine.exe: Microsoft C++ exception: std::bad_alloc @ 0x0012e89c.

Deze fout vloeit hoogst waarschijnlijk voort uit de vorige. Als je met pointers werkt en er nieuwe objecten voor aanmaakt, worden deze op de heap geplaatst. De code die je bijvoegde (_finally...) is de code die wordt uitgevoerd nadat er mogelijk een fout is gebeurd op de heap.
_finally is onderdeel van een try-catch blok, dus het try-catch blok van die _finally kan wschl meer info geven over wat foutging bij jou.

Mijn vermoeden is dat de eerste foutmelding, de 2de keer ook voorkomt, maar door iets anders wordt opgevangen, waardoor het 2de crasht...


Oplossing - volgende info nodig
Je zegt dat je 6 planes&textures geen problemen geven: is dat ook zo als je de 4 planes gebruikt en 2 textures in comment zet ?
Ik verwacht dat je dan ook een fout zal krijgen. Mijn denkpiste richt zich op het zoeken van de fout in de planeEntity-klasse

Heb je nog een andere compiler (g++ /mingw32) ? Probeer daar eens mee te compilen, met de optie '-Wall', zo kunnen mogelijke geheugenviolations aan het licht komen.

--Johan
 
Oplossing - volgende info nodig
Je zegt dat je 6 planes&textures geen problemen geven: is dat ook zo als je de 4 planes gebruikt en 2 textures in comment zet ?
Ik verwacht dat je dan ook een fout zal krijgen. Mijn denkpiste richt zich op het zoeken van de fout in de planeEntity-klasse

Heb je nog een andere compiler (g++ /mingw32) ? Probeer daar eens mee te compilen, met de optie '-Wall', zo kunnen mogelijke geheugenviolations aan het licht komen.

--Johan

Bij zes planes & textures(willekeurig dus bv. 4planes en 2texture, 3planes, 3 textures) gaat het nog goed, als ik een zevende plane of texture toevoeg gaar het fout.

Ik heb pas Visual Leakage Detection in mijn project geinclude, en deze geeft inderdaad een aantal leakages aan, maar de tekst die de VLD toont snap ik niet veel van en kom ik ook niet uit. Iemand die weet hoe hiermee om te gaan?
 
zit in de constructor van de entities/textures ergens een lus om bepaalde objecten aan te maken? Misschien wordt daar een lek gecreërd ?

Van google geplukt:
visual leakage detection genereert (oa) een stacktrace. Door op een lijn hierin te klikken springt je project naar het overeekomstige codefragment.

Zijn de lijnen die VLD aangeeft dezelfde als degene van je vorige foutmeldingen ?

--Johan
 
zit in de constructor van de entities/textures ergens een lus om bepaalde objecten aan te maken? Misschien wordt daar een lek gecreërd ?

Van google geplukt:
visual leakage detection genereert (oa) een stacktrace. Door op een lijn hierin te klikken springt je project naar het overeekomstige codefragment.

Zijn de lijnen die VLD aangeeft dezelfde als degene van je vorige foutmeldingen ?

--Johan

De lijnen die visual leakage detection aangeeft zijn anders dan het stuk code wat ik toevoeg wanneer het fout gaat....

Ik vraag me eigenlijk af hoe ik het beste meerdere soorten eniteiten kan aanmaken van bijvoorbeeld plane zonder dat ik dat op een PlaneEntity * frontPlane; manier doe.
Dus dat ik wel een frontPlane kan maken wat een type PlaneEntity is, zonder dit 'ruwe' pointer gedoe
 
Als je de objecten niet teveel moet doorgeven of volledig nieuwe waardes toekennen (eigenlijk een ander object onder dezelfde naam maken) kan je ipv de pointers, de gewone rechtstreekse declaratie gebruiken.

Code:
PlaneEntity frontpane(/* constructorargs */);

Let wel dat dit minder efficiënt is in geheugengebruik aangezien je object nu op de stack terechtkomt, en niet op de heap. (Een van de redenen waarom dat 'ruwe' pointergedoe in het leven is geroepen ;) )

--Johan
 
Als je de objecten niet teveel moet doorgeven of volledig nieuwe waardes toekennen (eigenlijk een ander object onder dezelfde naam maken) kan je ipv de pointers, de gewone rechtstreekse declaratie gebruiken.

Code:
PlaneEntity frontpane(/* constructorargs */);

Let wel dat dit minder efficiënt is in geheugengebruik aangezien je object nu op de stack terechtkomt, en niet op de heap. (Een van de redenen waarom dat 'ruwe' pointergedoe in het leven is geroepen ;) )

--Johan

Bedankt voor je hulp!
Helaas is dat eerste probleem niet opgelost, maar ga het nu anders aanpakken en dat lijkt wel te gaan werken :)
Ga ook nog even uitproberen, wat jij aangaf.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan