vererbungsproblem mit cstring()
-
hi!
ich habe eine Klasse CAccess, die abgeleitet ist von einer Klasse CAdoDB.
In CAdoDB sind mehrere CStrings als Stack-Variablen, die entweder protected oder public sind.
Sobald der Dekonstruktor von CAdoDB durch CAccess aufgerufen wird, gibt es eine Exception an der Stelle:
void Release() throw() { ATLASSERT( nRefs != 0 ); if( _InterlockedDecrement( &nRefs ) <= 0 ) { pStringMgr->Free( this ); } }^^ Gehört zu CString
Wenn man debuggt merkt man, dass die CStrings tlw. auf einen falschen Speicherbereich zeigen und dass obwohl sie nicht dynamisch sind... Das ist doch unmöglich, oder?
Der Dekonstruktor von CAdoDB ist virtual.
Was könnte sonst zu so einem Fehler führen? Ich bin leider nicht so der Profi was das vererben angeht...
EDIT: Dekonstruktor = Destruktor

-
bitte was iss ein dekonstruktor ????????
lt. c/c++ doku gibts so was net.... net einmal in der mfc-bib !
-
Ist wohl kaum ein Vererbugsproblem. Die üblichen Gründe sind:
a) Fandango on Core - du schreibst über ienen zulässigen Speicherbereich drüber raus, verwendest ein nicht mehr gültiges Objekt usw.
Das kann (leider) wo vollkommen anders sein...b) Stale Lib - eine eingebundene .lib verwendet eine andere Definition der Klasse (z.B. wo ein zuletzt eingeführter member nicht existiert)
c) Cast Away (
) du machst sowas:class A { ... };
class B : public A { };typedef .... C; // some type unrelated to A and B, could be "void"
B b;
C * ptr = &b; // reinterpret-cast: keine Anpassung durch Klassen-Hierarchie
A* pA = (A
ptr; // reinterpret-cast: keine Anpassung durch Klassen-Hierarchiedas ist equivalent mit einem reinterpret-cast von B nach A, und kann das beschriebene Problem verursachen.
(Wenn's das sein sollte - immer static_cast / dynamic_cast / reinterpret_cast / const_cast verwenden)