pointer auf klasse
-
hallo,
ich habe 2 klasse und will einen pointer auf die erste setzen und danach mit delete wieder freigeben. eigentlich ganz einfach, aber ich bekomme eine fehlermeldung beim starten des programms (der kompiler sagt nichts). hier die fehlermeldung:http://img212.imageshack.us/i/unbenanntkxf.jpg/
und hier der code:
class cls_alteklasse { ... } class bla{ private: cls_alteklasse *p1; public: bla(){} ~bla() { delete p1; } void Funktion () { p1 = new cls_alteklasse(...); // hier crashts }danke schonmal
-
Crasht es wirklich dort?
Ich hätte eher gedacht, dass es im Destruktor
~bla()zum Laufzeitfehler kommt. Schliesslich initialisierst du den Zeiger im Konstruktor nicht (du setzt ihn nicht einmal auf 0), und eventuell vergisst du,Funktion()aufzurufen. Dann hättest dudeleteauf einen nicht-initialisierten Zeiger, das ist nicht so gut.Ansonsten zeig mal den Konstruktor von
cls_alteklasse.
-
Ich kann mir nicht vorstellen, warum es ausgerechnet an dieser Stelle knallen sollte. Es sei denn, der Ctor von cls_alteklasse macht nicht mit.
In deinem Beispiel setzt du den Wert von p1 in bla::bla() nicht auf 0. Das könnte dann in bla::~bla() zu Problemen führen, aber die Stelle hast du ja nicht gekennzeichnet.
BTW: Wie wär's, wenn du dir beim Schreiben des (Beispiel-)Codes ein bischen mehr Mühe gäbst?
Stefan.
-
kunze schrieb:
p1 = new cls_alteklasse(...); // hier crashts
wenn ich new weglasse (also den pointer) und das ganze durch
cls_alteklasse p1(..);dann gehts.... sry wegen meinen mickrigen code. hier mal den ganzen code:
class cls_alteKlasse { private: HINSTANCE hInst; public: cls_alteKlasse(){ } ~cls_alteKlasse() { } cls_alteKlasse( WNDCLASSEX FensterName, HWND CreateWindowName, HWND alteshWnd, int x_Position, int y_Position, char reOli, char obOun, WNDPROC CallbackName){ hInst = (HINSTANCE) GetWindowLong(alteshWnd, GWL_HINSTANCE); FensterName.cbSize = sizeof(WNDCLASSEX); FensterName.style = CS_HREDRAW | CS_VREDRAW; FensterName.lpfnWndProc = CallbackName; FensterName.cbClsExtra = 0; FensterName.cbWndExtra = 0; FensterName.hInstance = hInst; FensterName.hIcon = LoadIcon(NULL, IDI_APPLICATION); FensterName.hCursor = LoadCursor(NULL, IDC_ARROW); FensterName.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); FensterName.lpszMenuName = NULL; FensterName.lpszClassName = (LPCSTR)CallbackName; FensterName.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&FensterName)) { MessageBox(0, "Fehler beim erstellen des Fensters", "Fehler!", MB_ICONEXCLAMATION | MB_OK); system("Pause"); } CreateWindowName = CreateWindow((LPCSTR)CallbackName, NULL, WS_CHILDWINDOW, fnk_Width(x_Position, reOli), fnk_Height(y_Position, obOun), x_Position, y_Position, alteshWnd, NULL, hInst, NULL); ShowWindow(CreateWindowName, SW_SHOW); UpdateWindow(CreateWindowName); } }; class cls_neueKlasse { private: cls_alteKlasse *p1; public: cls_neueKlasse(){ p1= 0;} ~cls_neueKlasse() { delete p1; } void ZeigerAufKlasse() { p1 = new cls_neuesFenster(); } };
-
Das ist mit Sicherheit nicht der Code, der den Fehler verursacht.
Warum soll ich also darin einen Fehler suchen?Stefan.
-
eigentlich ist das der code der den fehler verursachen MUSS, naja hier mal die vollständige klasse, mit unnötigen codezeilen

class cls_neueKlasse { private: void* p_text; unsigned int textSize; cls_alteKlasse *p1; char *archivName; char *finde; char *pw; public: cls_neueKlasse(){ p_text = 0; textSize = 0; archivName = "C:/Users/Moe/Desktop/Desktop.zip"; pw = "alpine"; p1 = 0;} ~cls_neueKlasse() { delete[] p_text; delete p1; } void ZeigerAufKlasse(WNDCLASSEX WinName, HWND WindowName, HWND oldHwnd, int x, int y, char reOli, char obOun, WNDPROC CallbackName, char *Argument) { int result = readArchivedFile(archivName, "info.txt", pw, &p_text, &textSize); if(result) { MessageBox(0, "Fehler!", "Fehler!", MB_ICONEXCLAMATION | MB_OK); } else { std::string DateiText(static_cast<char*>(p_text), textSize); if(DateiText.find(Argument) != std::string::npos) { p1 = new cls_alteKlasse(WinName, WindowName, oldHwnd, fnk_Width(x, reOli), fnk_Height(y, obOun), reOli, obOun, CallbackName); } } } };und aufrufen tu ich das alles
cls_neueKlasse Test1; Test1.ZeigerAufKlasse(Win1, WindowT1, hWnd, 0, 0, 'r', 'o', TL1, "played: 0;"); Test1.~cls_neueKlasse();
-
@ mascerade:
Bitte poste nächstes Mal unter gleichem Namen oder identifiziere dich wenigstens, sonst kann schnell Verwirrung entstehen.Warum rufst du den Destruktor manuell auf? Erst kürzlich meinte auch jemand, er müsse das tun. Lass die Zeile weg, der Destruktor wird bereits beim Verlassen des Scopes aufgerufen, bzw. bei
delete, wenn du mitnewangefordert hast.
-
achso^^... jetzt gehts! danke