Guybrush Threepwood Geschrieben 10. Juni 2003 Geschrieben 10. Juni 2003 Hi, ich hab in einer Dll zwei Klassen (Klasse1 und Klasse2). In Klasse2 habe ich eine private Variable: Klasse1 **lpRows; Im Konstruktor wird lpRows auf NULL gesetzt. Danach rufe ich eine Methode der Klasse auf die lpRows weder benutzt noch verändert, lpRows bleibt also auf NULL. Im Destruktor soll lpRows mit delete[] wieder gelöscht werden, wenn es ungleich NULL ist. Wenn jetzt aber der Destruktor von Klasse2 aufgerufen wird, hat lpRows plötzlich den Wert 0xfffffff und ich bekomme bei delete[] eine Access Violation. :confused: Ich hoffe mir kann einer helfen. Gruß Guybrush Zitieren
ITSE Geschrieben 10. Juni 2003 Geschrieben 10. Juni 2003 versuche halt mit dem Debugger (ich hoffe du hast VC++) jeden Schritt durchzuklicken und gleichzeitig die Pointer-Variable zu beobachten... Dann siehst du bestimmt wann die Variable den Wert ändert... Zitieren
Knuddlbaer Geschrieben 10. Juni 2003 Geschrieben 10. Juni 2003 Zeig mal bitte den Destruktor Zitieren
Guybrush Threepwood Geschrieben 12. Juni 2003 Autor Geschrieben 12. Juni 2003 Original geschrieben von ITSE versuche halt mit dem Debugger (ich hoffe du hast VC++) jeden Schritt durchzuklicken und gleichzeitig die Pointer-Variable zu beobachten... Dann siehst du bestimmt wann die Variable den Wert ändert... Das hab ich ja gemacht, und sie ändert sich nicht. Zeig mal bitte den Destruktor Da wird nur die Variable gelöscht wenn sie nicht NULL ist: OLEDB::~OLEDB() { if (lpRows != NULL) delete[] lpRows; } [/PHP] Zitieren
Klotzkopp Geschrieben 12. Juni 2003 Geschrieben 12. Juni 2003 Nur am Rande: Da delete bei einem Nullzeiger nichts bewirkt, kannst du dir das if sparen. Zum eigentlichen Problem: Hat die Klasse noch andere Member, womöglich Arrays? Du könntest auch einen Watchpoint auf den Zeiger setzen, so dass dein Programm beim Debuggen anhält, sobald der Zeiger verändert wird. Ob und wie das geht, hängt vom benutzten Debugger ab. Zitieren
Guybrush Threepwood Geschrieben 12. Juni 2003 Autor Geschrieben 12. Juni 2003 Original geschrieben von Klotzkopp Nur am Rande: Da delete bei einem Nullzeiger nichts bewirkt, kannst du dir das if sparen. Ich dachte dann tritt auch eine Accessviolation auf. Zum eigentlichen Problem: Hat die Klasse noch andere Member, womöglich Arrays? Das sind alle Variablen: IDataInitialize* pIDataInit; IDBInitialize* pIDBInitialize; IRowset* pIRowset; LPDSTR **lpRows; int nAnzRows, nAnzCols; char cDelimiter; bool bInit; Du könntest auch einen Watchpoint auf den Zeiger setzen, so dass dein Programm beim Debuggen anhält, sobald der Zeiger verändert wird. Ob und wie das geht, hängt vom benutzten Debugger ab. Ich benutze den Debugger von Visual C++6.0 Zitieren
Knuddlbaer Geschrieben 12. Juni 2003 Geschrieben 12. Juni 2003 Mit welchem Compiler hast Du gearbeitet ? Wenns nen VC6 VC7 oder Borland 6 ist, schick das PRojekt mal per mail. Interessiert mich das problem ) Zitieren
Klotzkopp Geschrieben 12. Juni 2003 Geschrieben 12. Juni 2003 Original geschrieben von Guybrush Threepwood Ich benutze den Debugger von Visual C++6.0 Da kannst du mit Strg-B auf dem Reiter "Data" solche Breakpoints setzen. Gib als Ausdruck deinen Zeiger an, und als Länge 4. Zitieren
Knuddlbaer Geschrieben 12. Juni 2003 Geschrieben 12. Juni 2003 LPDSTR -> wie ist der definiert ? Hört sich an als könnte es DSTR * sein. Das würde dann DSTR *** lpRows geben. Ist es das was Du beabsichtigst ? Zitieren
Guybrush Threepwood Geschrieben 12. Juni 2003 Autor Geschrieben 12. Juni 2003 Original geschrieben von Klotzkopp Da kannst du mit Strg-B auf dem Reiter "Data" solche Breakpoints setzen. Gib als Ausdruck deinen Zeiger an, und als Länge 4. Was muß ich denn da bei den weiteren Optionen angeben? Weil beim debuggen bekomme ich immer die Meldung das ein Haltepunkt nicht gesetzt werden konnte. LPDSTR ist meine andere Klasse. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.