new und delete
-
Hi!
Habe nen ganz komisches Problem, ist mir unerklärbar:
meFrameCounter* fc = NULL; fc = new meFrameCounter; fc->Init(/*...*/); // mach was damit. fc->Shutdwon(); delete fc;
Bei der Zeile delete fc kommt der Fehler. Er kommt auch, wenn ich einfach nur
fc = new meFC;
delete fc
mache.
Es kommt Debug Assertion failed aus dbgheap.c _pFirstBlock == pHead ergibt false. Woran kann das liegen?
-
Der Destruktor von meFrameCounter ok ? (was passiert wenn Du es ohne delete anlegst und das Programm beendet wird ?)
-
der Destruktor macht ncihts.
Wenn ich es ohne delete mache gehts.Habs jetzt aber hingekriegt. Mein Konstruktor sieht so aus:
meFrameCounter::meFrameCounter()
{
ZeroMemory(this, sizeof(meFramEocunter));
}Ohne Zero geht das gut...
Ich hätte nciht gedacht, dass das so schlimme auswirkungen hätte.
-
das liegt eben an der virtuellen-tabelle. Da werden eben Pointer auf die Funktionen gespeichert (auch auf den dtor), wenn du die natürlich überschreibst ist das nicht optimal.
-
Hm... also das funzt ja jetzt jednefalls. Aber dann kommt auch schon das nächte Problem:
Weni ch ein Objekt vom Typ meGUI erstelle, es dann delete funzt es gut. Wenn ich dann aber noch meGUI::Init aufrufe, dann kommt ein DIalogfeld, dass ich noch nie gesehen habe:
Debug Error!
DAMAGE: after normal blcok (#21) 0x019105A64Was ich komisch finde ist, dass der Destruktor gar nciht aufgerufen wird.
Init sieht so aus:
meResult meGUI::Init(const meGUIConfig* config, MEGUI_MESSAGEPROC MessageProc) { // Config speichern memcpy(&m_Config, config, sizeof(meGUIConfig)); // Nachrichtenfunktion eintragen m_UserMessageProc = MessageProc; // Elementlisten speichern m_EleLists = new std::list<meGUIElement*>[m_Config.NumPages]; for(int l = 0; l < m_Config.NumPages; l++) m_EleLists[l].clear(); // Vertexbuffer erstellen if(FAILED(me_g_D3D->GetDevice()->CreateVertexBuffer(1000 * sizeof(meGUIVertex), D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, ME_GUI_VERTEXFVF, D3DPOOL_DEFAULT, &m_VertexBuffer, NULL))) return ME_ERROR; // Elementpositionen speichern, fült nur ein internes Array aus ComputeElementPositions(); m_RelativePos.x = (me_g_D3D->GetScreenWidth() - config->Size.x) / 2; m_RelativePos.y = (me_g_D3D->GetScreenHeight() - config->Size.y) / 2; m_ActivePage = 0; m_IsInit = true; m_IsUnit = false; return ME_OK; }
Seht ihr den Fehler?
-
Was ist meGUIConfig ?
-
das ist das hier:
struct meGUIConfig { DWORD NumPages; // Anzahl der Seiten des GUI mePoint Size; // Größe einer einzelnen Seite PDIRECT3DTEXTURE9 Skin; // Zu verwendende SkinTextur meFont* Font; // Zu verwendender Font PDIRECT3DTEXTURE9 BGImage;// Hintergrundbild; NULL = keins D3DCOLOR NormalColor; // Normale Farbe der Steuerelemente D3DCOLOR DisabledColor; // Farbe für deaktivierte Steuerelemente D3DCOLOR FocusColor; // Farbe für aktive Steuerelemente D3DCOLOR TextColor; // Farbe für alle Texte mePoint CursorSize; // Größe des Cursors mePoint CursorHotSpot; // Hotspot des Cursors int CursorSpeed; // Geschwindigkeit des Cursors }; // so sieht es in meGUI.h aus: class meGUI { //... meGUIConfig m_Config; };
Hilft das was?
-
Und warum kopierst du das struct dann mit memcpy und nimmst nicht einfach "=" (den Parameter per Referenz auf const zu übergeben bietet sich auch an)? Wenn du ständig mit Zeigerkanonen auf Spatzen schießt, wundern mich die ganzen Speicherfehler auch nicht... Ich sehe zwar auf Anhieb keinen Fehler (der kann auch gut woanders liegen), aber reichlich Stellen, wo du solche Fehler provozierst.
-
so, habe jetzt den Fehler gefunden. Mein Array hatte zuweing Indizes:
enum MEGUI_TEXTUREPOS { //... // Am Ende steht MEGUI_TT_INPUT_BOTTOMRIGHT } class meGUI { float m_TTPos[MEGUI_TT_INPUT_BOTTOMRIGHT][4]; }; //Compute Element Positions ComputeElementPositions() { // ... m_TTPos[MEGUI_TT_INPUT_BOTTOMRIGHT][0] = sonstewas; }
naja, jetzt klappts jedenfalls
Hab den pointer in eine Referenz umgewandelt