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) 0x019105A64

    Was 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


Anmelden zum Antworten