PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Sprung in falsche Funktionen


mekakic
2010-08-02, 11:48:10
something is very wrong unter VS7.1 ... ich habe gerade mit Fremdcode zu tun und dort ein paar Änderungen durchgeführt. Jetzt habe ich mich gewundert, dass ich an einer Stelle immer in eine Exception laufe - lange vor der Stelle im Programm wo ich Änderungen vorgenommen habe.

Ich habe erst nicht gesehen, was falsch läuft - aber plötzlich fiel mir auf, dass ich in einer Klasse in die falschen Memberfunktionen springe. :confused:

Wenn ich einen Call auf einem Pointer mache z.B. "foo->test1()" lande ich in "foo->test2()". Alle Calls landen anscheinend in der Funktion die im Code einen tief hängt.

Ich habe mir das genauer angeschaut und die fragliche Klasse hat komplett virtuelle Funktionen. Ich dachte irgendwas passiert zur Laufzeit evtl. mit der vtable. Also hab ich das Objekt im Debugger komplett verfolgt und im Konstruktor ist noch alles in Ordnung und die Pointer auf die Funktionen werden richtig abgebildet, wenn ich aber den Konstruktor Scope verlasse und dann im Construtor Scope der Child Class bin (also die von der fraglichen Klasse erbt), dann sind die Pointer plötzlich falsch und auf andere Funktionen abgebildet. Also foo->test1() zeigt dann auf eine Adresse die im Disassembly an bei foo::test2() liegt.

Code kann ich nicht posten, aber ich frage mich ob jemand eine Idee hat, durch was sowas evtl. verursacht wird KÖNNTE, ganz grundsätzlich, weil ich den Fehler absolut nicht finde.

noid
2010-08-02, 12:45:25
Sicher, dass deine Typen richtig genutzt werden und da kein unsauberes cast drin vorkommt?
Wer sagt außerdem, dass es vorher funktioniert hat? X-D

PS: wenn du den Code so präparieren könntest, damit man sieht wie foo etc. deklariert werden. Rudimentäre Classenfunktion.

Neomi
2010-08-02, 13:54:43
Das könnte passieren, wenn die Interface-Klasse nicht exakt so, wie sie nach außen hin angeboten wird, auch intern im fraglichen Paket verwendet wird. Wenn beispielsweise das Interface in einer Header-Datei steht und modifiziert wurde, eine der konkret davon ableitenden Klassen aber nicht diese Header-Datei benutzt, sondern eine veraltete lokale Kopie der Interface-Deklaration.

mekakic
2010-08-02, 14:11:45
Exakt das war es auch. X-( Build Scripte habe die Header irgendwohin exportiert, die Komponente wurde mal in ein anderes Paket verschoben und plötzlich blieben zwei Header Definitionen hängen (lokal), die beim Clean nicht gelöscht wurden. Und in einem anderen Kontext wurden da wohl die anderen Header angezogen.... danach habe ich ewig gesucht, danke!