Zeigerproblem mit delete...
-
HalliHallo,
ein kleines Problem mit delete hat sich bei mir aufgetan und ich weiß nicht so recht woran das liegt. Erst mal der scr:
in DLL:
bool GL_Texture::GenMathTexture(unsigned int &texture, GL_PIXEL_BUFFER*(*pTextureFunc)(), int quality) { GL_PIXEL_BUFFER *pBitmap = NULL; pBitmap = pTextureFunc(); [...] /*if(pBitmap) { if(pBitmap->data) { delete[] pBitmap->data; } delete pBitmap; pBitmap = NULL; }*/ return true; }Bei dem Auskommentierten stürzt das Prg. ab (wenn es aktiv ist ^^) mit folgender Fehlermeldung:
File: dbgdel.cpp
Line: 52Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
damit kann ich nicht wirklich was anfangen ^^
im Aufrufenden Programm:
GL_PIXEL_BUFFER *GenTexture() { GL_PIXEL_BUFFER *pBitmap = new GL_PIXEL_BUFFER; pBitmap->sizeX = 512; pBitmap->sizeY = 512; pBitmap->type = GL_RGBA; pBitmap->data = new unsigned char[pBitmap->sizeX * pBitmap->sizeY * 4]; [...] return pBitmap; } // eng->GenMathTexture(textur1, GenTexture, 2);Die Textur wird korrekt in OpenGL erzeugt und dargestellt, nur der Puffer wird will sich nicht löschen lassen.
Kann man in DLL's keine Pointer mehr löschen die in der exe erstellt worden sind?Thx für Hilfe
-
Warum setzt du das "delete[] data;" nicht in den Destruktor?
-
Da die Klasse erst beim beenden des Prg. zerstört wird und die GenTexture-Funktion mehrmals aufgerufen werden kann im Programm.
-
Hat keiner eine mögliche Lösung?
Die Klasse steht in abhängigkeit zu anderen Klassen und deshalb kann ich es dort nicht im Dekonstruktor löschen.
-
Stürzt das Programm zur Laufzeit ab? Weil die Fehlermeldung sieht mir nach einem Compilerfehler aus, oder verwechsel ich da was?
mfg.
-
joomoo schrieb:
oder verwechsel ich da was?
Sieht eher nach einem angeschlagenen ASSERT aus - normalerweise hast du dort die Auswahl zwischen Abbrechen (beendet das Programm), Wiederholen (startet den Debugger) und Ignorieren (setzt das Programm fort) - wähl mal das zweite und prüf' im Debugger, ob dort alle Werte richtig gesetzt sind.
-
Jap, das Prg. stürzt zur Laufzeit ab und ist ein ASSERT so wie es ausschaut.
Hab von den 3 Möglichkeiten schon alle 3 durchprobiert. nur alles was ich sehe sind die variablen von der "dbgdel.cpp". Und die sind irgendwie nicht aussagefähig im zusammenhang.
Die Adressen der pointer stimmen nach wie vor, nur wenn das delete aufgerufen wird -> bumm...

-
Geh mal den Call-Stack etwas nach oben im Debugger, bis du zu deinen eigenen Funktionen gelangst - womöglich versuchst du ja, den selben Bereich doppelt wieder freizugeben.
-
So, hab mir jetzt den stack mal angeschaut. Dort steht folgendes:
> Engine.dll!_free_dbg_lk(void * pUserData=0x01cb0040, int nBlockUse=1) Line 1200 + 0x2a C Engine.dll!_free_dbg(void * pUserData=0x01cb0040, int nBlockUse=1) Line 1070 + 0xd C Engine.dll!operator delete(void * pUserData=0x01cb0040) Line 54 + 0x10 C++ Engine.dll!operator delete[](void * p=0x01cb0040) Line 21 + 0x9 C++ Engine.dll!GL_Texture::GenerateTexture(unsigned int & texture=2, GL_PIXEL_BUFFER * (void)* pTextureFunc=0x00411668, int quality=2) Line 211 + 0x17 C++ TestApp2.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00141f18, int iCmdShow=1) Line 39 + 0x26 C++ TestApp2.exe!WinMainCRTStartup() Line 251 + 0x30 C kernel32.dll!7c816d4f() ntdll.dll!7c925b4f() kernel32.dll!7c8399f3()Die 2 Funktionen sind nach wie vor unverändert wie oben.
In der 'GenTexture'-Funktion lege ich den Speicher mit new an, und nur in der Klassenfunktion 'GenMathTexture' will ich ihn löschen und wird auch nur dort gemacht! Nur dort gibt es ein delete.
-
Kann es sein, das du in pTextureFunc() das speicher mit sowas wie "new char[...];" anlegst?
Dieses Fehlermeldung tritt nähmlich meistens dann auf, wenn ein block mit einen Type (zB char) angelegt wurde, aber mit einen anderen freigemacht wird (in deinem fall - GL_PIXEL_BUFFER). Wenn es so ist, solltest du es so machen: "delete[] (char*) pBitmap->data;"
---------------
Uups, ich habe hier blödsinn geschrieben..... Aber der sinn ist richtig - bist du sicher das der pointer das richtige Type hat?
-
Stimmt, data ist eine new unsigned char[...].
Hier nochmal was mit new angelegt wird und wie es gelöscht wird:
struct GL_PIXEL_BUFFER { unsigned char *data; int sizeX; int sizeY; GLenum type; }; //Ein neues Objekt von GL_PIXEL_BUFFER in der pTextureFunc() GL_PIXEL_BUFFER *pBuf = new GL_PIXEL_BUFFER; //sowie der data-puffer pBuf->data = new unsigned char[pBuf->sizeX * pBuf->sizeY * 4]; //und jetzt das löschen in der Klassenfunktion: if(pBitmap) { if(pBitmap->data) { delete[] pBitmap->data; } delete pBitmap; pBitmap = NULL; }Müßte doch theoretisch so funktionieren??? Oder hab ich hier tatsächlich was übersehen? Denn er mault ja schon bei delete pBitmap rum.