Statische Variable löschen
-
Hi Leute
Angenommen ich habe in einer Klasse eine statische Variable. Diese variable ist aber der Zeiger auf diese Klasse. Jetzt habe ich in einer Statischen Funktion diese mit Speicher reserviert. Kann ich danach diese Variable mit delete löschen? Irgendwie kommt bei mir eine Fehlermeldung raus und zwar in dbgdel.cpp beim Befehl/Makro _ASSERTE((_BLOCK_TYPE_IS_VALID(pHead->nBlockUse
-
Ob der Pointer auf die Klasse statisch ist oder nicht interessiert nicht. Dein Code sollte also compilieren. Vermutlich machst du irgendwas anderes falsch. Poste mal ein Minimalbeispiel.
-
Funktioniert alles hier:
class Foo { public: static void create() { self = new Foo(); } static void destroy() { delete self; } int x; static Foo* self; }; Foo* Foo::self; int main() { Foo::create(); Foo::self->x = 5; Foo::destroy(); }
-
Wie verwendet man die [] Tags zum C++ Code zu posten?
-
Ich habs doch geschaft den Code zu posten, juhui!
Das ist eine Thread-Funktion, nachdem die Variable erstell wird habe noch zusätzlich ein "delete" eingebaut damit klar ist, dass der Fehler nicht bei der Funktion go() liegt. Aber ich denke die Sache ist hoffnungslos, es müsste doch alles stimmen oder?// PlayerWeiss.cpp #include "PlayerWeiss.h" PlayerWeiss* PlayerWeiss::m_pPlayerWeiss=nullptr; DWORD WINAPI PlayerWeiss::threadProcWeiss(PVOID pParams) { int iEndOfGameFlag; //saveDelete(&PlayerWeiss::m_pPlayerWeiss); PlayerWeiss::m_pPlayerWeiss=new PlayerWeiss(WEISS); // Wenn PlayerWeiss mit schwarzen Figuren spielt, eventuell Werte mitgeben, bFarbe,bZugrichtung u.s.w. delete(PlayerWeiss::m_pPlayerWeiss); iEndOfGameFlag=m_pPlayerWeiss->go(pParams); delete(PlayerWeiss::m_pPlayerWeiss); PostMessage(static_cast<LPTHREADPARAMS>(pParams)->mainHwnd,WM_SPIEL_BEENDEN,static_cast<WPARAM>(iEndOfGameFlag),NULL); return 0; // Thread terminieren }
-
double delete
-
Damit keine Missverständnisse aufkommen: Das erste delete habe ich nacher zur Kontrolle eingebaut, nochmals durch den Debugger gejagt und festgestellt, dass der Fehler beim jetzt beim ersten delete ist. Also double delete kann nicht in Frage kommen.
-
Zeige doch besser sinnvollen Code.
Hier machen Zeile 13 und 15 so keinen Sinn (wegen Zeile 12).
Da wird es schwierig herauszufinden, wo jetzt das eigentliche Problem liegt.Edit:
Hilfreich wäre die gesamte Definition der PlayerWeiss-Klasse.
-
Also hier habe ich den Code bei dem der Fehler bei delete(m_pPlayerWeiss) auftaucht: Unbehandelte Ausnahme bei 0x00007FFAC3F7B014 (msvcr110d.dll) in GraphicChess14_4AltesSystem.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xFFFFFFFFFFFFFFFF
// PlayerWeiss.cpp #include "PlayerWeiss.h" PlayerWeiss* PlayerWeiss::m_pPlayerWeiss=nullptr; DWORD WINAPI PlayerWeiss::threadProcWeiss(PVOID pParams) { int iEndOfGameFlag; saveDelete(&PlayerWeiss::m_pPlayerWeiss); PlayerWeiss::m_pPlayerWeiss=new PlayerWeiss(WEISS); // Wenn PlayerWeiss mit schwarzen Figuren spielt, eventuell Werte mitgeben, bFarbe,bZugrichtung u.s.w. delete(PlayerWeiss::m_pPlayerWeiss); iEndOfGameFlag=m_pPlayerWeiss->go(pParams); delete(PlayerWeiss::m_pPlayerWeiss); PostMessage(static_cast<LPTHREADPARAMS>(pParams)->mainHwnd,WM_SPIEL_BEENDEN,static_cast<WPARAM>(iEndOfGameFlag),NULL); return 0; // Thread terminieren } PlayerWeiss::PlayerWeiss(const BOOL bPlayerFarbe) :BasisPlayer(bPlayerFarbe), m_pPlayerWeiss2(nullptr) { m_pPlayerWeiss2=new PlayerWeiss2(m_bPlayerFarbe, m_pppFigurenBrett, m_pppFigurenListe, m_iLastIndex ); } PlayerWeiss::~PlayerWeiss(void) { saveDelete(&m_pPlayerWeiss2); }Kann das vielleicht am Konstruktor von m_pPlayerWeiss liegen? Vielleicht wegen der Basis Klasse? Ich bin mitlerweile völlig verwirrt. Ich glaube ich lasse das delete weg und lasse das Betriebssystem die Aufräumarbeit machen!
-
Und die Funktion wird von mehreren Threads ausgeführt?
saveDelete?
-
Leute sorry, habe wieder den falschen Code gepostet. Dafür habe ich meinen Benutzernamen richtig gewählt.
// PlayerWeiss.cpp #include "PlayerWeiss.h" PlayerWeiss* PlayerWeiss::m_pPlayerWeiss=nullptr; DWORD WINAPI PlayerWeiss::threadProcWeiss(PVOID pParams) { int iEndOfGameFlag; PlayerWeiss::m_pPlayerWeiss=new PlayerWeiss(WEISS); // Wenn PlayerWeiss mit schwarzen Figuren spielt, eventuell Werte mitgeben, bFarbe,bZugrichtung u.s.w. delete(PlayerWeiss::m_pPlayerWeiss); // Bis da kommt es gar nicht, Fehler taucht auf iEndOfGameFlag=m_pPlayerWeiss->go(pParams); PostMessage(static_cast<LPTHREADPARAMS>(pParams)->mainHwnd,WM_SPIEL_BEENDEN,static_cast<WPARAM>(iEndOfGameFlag),NULL); return 0; // Thread terminieren } PlayerWeiss::PlayerWeiss(const BOOL bPlayerFarbe) :BasisPlayer(bPlayerFarbe), m_pPlayerWeiss2(nullptr) { m_pPlayerWeiss2=new PlayerWeiss2(m_bPlayerFarbe, m_pppFigurenBrett, m_pppFigurenListe, m_iLastIndex ); } PlayerWeiss::~PlayerWeiss(void) { saveDelete(&m_pPlayerWeiss2); }
-
Also, der richtige Code ist jetzt erst löschen und dann benutzen?
-
Nein diese Funktion wird vorerst von einem Thread ausgeführt, sollte aber in Zukunft für mehrere Threads geeignet sein. Der Fehler taucht auch dann auf, wenn ich saveDelete lösche.
-
saveDelete(&m_pPlayerWeiss2);Wie sieht safeDelete aus? Wird diese Aufruf überhaupt erreicht (Breakpoint setzen) ?
Stacktrace?
-
Der Tipp mit Breakpoint im Destruktor setzen hat geholfen. Das ich nicht selber drauf gekommen bin! Nach diesem Destruktor werden 3 weitere Destruktoren aufgerufen, und beim einen ist ein Array mit Zeigern die nicht richtig initialisiert waren.
Vielen Dank Leute.