Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Problem mit Klassen und DLLs (VS6)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.03.2006, 11:13 Uhr
WickedImp



moin, moin

ich habe hier ein problem, mit dem ich mir wirklich nicht mehr weiterhelfen kann. Habe leider auch keine ahnung, nach was ich suchen soll... hoffe mir kann man noch helfen

folgender ausgangspunkt: um mehr über klassen und shared libraries zu lernen habe ich beschlossen eine game engine (...) zu schreiben. die engine selber soll dabei eine shared dll sein und das interne ist klassenbasiert (hauptklasse, resourcenmanager, video, audio, netzwerk, etc...). das ganze basiert auf SDL 1.2.8. es gibt zwei funktionen die per '__declspec(dllexport)' (weiss jemand zufällig die form für linux?) exportiert werden:


C++:
wge::engine_o *wge::create();
wge::destroy( wge::engine_o *hWGE );

namespace wge {
    engine_o *create() {
        return new engine_o();
    }

    void destroy( engine_o *hWGE ) {
        if( hWGE == NULL ) return;
        delete hWGE;
    }
}



zum debuggen gibt jeder constructor und destructor eine kurze zeile aus, wer gerade am zug ist. der constructor von engine_o erzeugt dann weitere pointer auf neue klassen (richtig formuliert?) von den subsystemen. der destructor soll diese später wieder löschen (kurzfassung des codes):


C++:
namespace wge {
    engine_o::engine_o() {
        ... (einige NULL zuweisungen für die this->h* Variablen)
        this->hCVar = new wge::cvar::cvar_o();
        this->hResource = new wge::resource::resource_o();
        this->hAudio = new wge::audio::audio_o();
        this->hNet = new wge::net::net_o();
        this->hVideo = new wge::video::video_o();
        ...
    }
    engine_o::~engine_o() {
        if( this->hVideo != NULL ) {
            delete this->hVideo;
            this->hVideo = NULL;
        }
        if( this->hNet != NULL ) {
            delete this->hNet;
            this->hNet = NULL;
        }
        if( this->hAudio != NULL ) {
            delete this->hAudio;
            this->hAudio = NULL;
        }
        if( this->hResource != NULL ) {
            delete this->hResource;
            this->hResource = NULL;
        }
        if( this->hCVar != NULL ) {
            delete this->hCVar;
            this->hCVar = NULL;
        }
    }
}



definition der engine_o (kurzfassung):


C++:
namespace wge {
    class engine_o {
    public:
        __declspec(dllexport) engine_o();
        __declspec(dllexport) ~engine_o();
        __declspec(dllexport) wge::cvar::cvar_o            *getCVar();
        __declspec(dllexport) wge::resource::resource_o    *getResource();
        __declspec(dllexport) wge::audio::audio_o        *getAudio();
        __declspec(dllexport) wge::net::net_o            *getNet();
        __declspec(dllexport) wge::video::video_o        *getVideo();
        ...
    private:
        wge::cvar::cvar_o                    *hCVar;
        wge::resource::resource_o            *hResource;
        wge::audio::audio_o                    *hAudio;
        wge::net::net_o                        *hNet;
        wge::video::video_o                    *hVideo;
        ...
    };
}



und jetzt kommt der hammer. bis vor kurzem ging das alles soweit ganz gut... jeder constructor gab seinen debug aus. und beim aufruf von wge::destroy( hWGE ); wurden soweit ich mich erinnern konnte alle debugs von den jeweiligen destructors aufgerufen. jetzt nicht mehr. folgende ausgabe der konsole von Visual Studio 6:


Code:
[engine_o::engine_o]: constructor
[cvar::cvar_o::cvar_o]: constructor
[resource::resource_o::resource_o]: constructor
[audio::audio_o::audio_o]: constructor
[net::net_o::net_o]: constructor
[video::video_o::video_o]: constructor
[video::video_o::~video_o]: destructor
Press any key to continue



habe dann natürlich den debugger von Microsoft angeschmissen. Nen Breakpoint vor dem Aufruf von wge::destroy(). Beim Step-Into springt er zur destroy in der DLL und ruft dann delete auf. Beim weiteren durchsteppen dann erstmal ne Weile POPs und RETs, bis er dann eine DBGHEAP.C (und einige andere) verlangt (??? - macht auch ohne weiter). Bis er dann letzten endes folgendes in der debug konsole ausspuckt:


Code:
HEAP[TechDemo.exe]: Invalid Address specified to RtlValidateHeap( 009A0000, 003F5588 )
The thread 0x8F8 has exited with code 3 (0x3).
The thread 0x73C has exited with code 3 (0x3).
The thread 0xBF4 has exited with code 3 (0x3).
The thread 0x10C has exited with code 3 (0x3).
The program 'D:\Share\Development\WickedGE\TechDemo.exe' has exited with code 3 (0x3).



so... jetzt weiss ich natürlich nicht was mir der exit code 3 sagen sollte. aber ich gehe jetzt davon aus, das irgendwie mehr vom stack geholt wurde als drauf ist?! bei einem einfachen programm - nur wge::create und direkt danach wge::destroy - wird auch in den subklassen kein weiteres new oder delete aufgerufen. ich vermute jetzt einfach mal, das ich in der kombination dllexports, klassen, pointer auf klassen und new/delete calls was verpeilt habe. jetzt ist nur noch die frage: was?

danke schonmal im vorraus für eure bemühungen. hilfreich wären auch tipps, wie ich z.B. den debugger besser einsetzen könnte, um mehr infos aus diesem rauskitzeln zu können.

MfG
der Imp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: