Pure virtual function call



  • Hallo Zusammen,

    wenn ich mein programm schließe, bekomme ich manchmal(!) die Meldung

    "Pure virtual function call"
    

    Weiß jemand was das bedeutet und wie man das weg bekommt? 😕
    Hängt das evt. mit dem Thread zusammen, den ich verwende? Das shutdown event, das ich dem Thread vor Ende des Programms sende scheint nicht richtig zu arbeiten, aber sicher bin ich mir da nicht... 😞

    Bin für jeden Tip dankbar!!



  • http://www.artima.com/cppsource/pure_virtual.html

    Da gibts ne gute Erläuterung, wo dieser Fehler herkommt.



  • Hallo Pellaeon,

    vielen Dank für den Link. Leider nützt er mir nicht allzu viel, da ich von C++ eigentlich nicht so viel verstehe und im wesentlichen C programmiere - im MFC-Umfeld. Ich habe schon viele Programme in VC 6 geschrieben und so ein Problem noch nie gehabt. Wieso hab' ich es jetzt? Ich hab genauso gearbeitet wie sonst auch. Bewußt habe ich jedenfalls keine virtuellen Klassen oder Ähnliches erzeugt. Wenn ich etwas selbst schreibe, dann nur C-Funktionen. Die Frage ist nun, ob es eine einfache Lösung gibt das abzustellen - z.b. eine Compiler-Option, die zumindest die ebenso sinnlose wie ärgerliche Fehlermeldung unterdrückt oder sonstwas einfaches. 😉
    Um die angegebene Erläuterung zu verstehen brauch ich einfach zu lange... 😞



  • Wenn du mit etwas arbeitest was du nicht verstehst ist es doch aber irgendwie nicht verwunderlich dass du Fehler machst?
    Davon abgesehen: MFC ist C++, wie also meinst du mit "C im MFC Umfeld" arbeiten zu können?



  • ich schreibe alles als C-Funktion. Die MFC benutze ich für das GUI. Das hat bisher (bereits mehrere Projekte - seit etwa 18 Monaten!) auch prima geklappt! Soweit, daß ich die MFC-Klasse verwenden kann, versteh ich die Geschichte! Aber das war's dann auch. Ganz ohne Polemik: Man kann mit VC 6 bzw. VC 2005 ganz hervorragend C-Programme erstellen, die ein MFC-GUI haben - eigentlich kein Problem! Wirklich!

    Aber mir ist aufgefallen, daß seit einiger Zeit eine Linker-Warnung angezeigt wird, mit der ich nichts anfangen kann:

    LINK : warning LNK4076: Inkrementelle Statusdatei "C:\VC2005 Source\X303Monitor\Debug\X303Monitor.ilk" ungültig; Verknüpfung erfolgt nicht inkrementell.
    

    Vieleicht ist das ja des Pudels Kern... 😕



  • Ein "Pure virtual function call" Fehler KANN aber nicht von der Verwendung von "C Funktionen" herkommen, da es hier um C++ Klassen mit "virtual pure" Funktionen geht.
    Also musst du da etwas falsch machen, etwas was mit Klassen und virtuellen Funktionen zu tun hat.

    Was genau du falsch machst kannst du aber nicht verstehen ohne dass du verstehst was "virtual pure" Funktionen sind, und was man damit eben nicht machen darf.

    Der "Inkrementelle Statusdatei ungültig" Fehler hat damit vermutlich nix zu tun, den solltest du auch loswerden können indem du einfach mal das ganze "X303Monitor\Debug" Verzeichnis löscht, bzw. auf "Alles neu erstellen" drückst.



  • Hallo hustbaer,

    stimmt, den

    LINK : warning LNK4076: Inkrementelle Statusdatei "C:\VC2005 Source\X303Monitor\Debug\X303Monitor.ilk" ungültig; Verknüpfung erfolgt nicht inkrementell.
    

    Fehler bin ich durch löschen einer Datei Namens *.ilk im Debug-Verzeichnis losgeworden.

    Du hast recht, der C-Code ist sicher nicht schuld. Aber vielleicht folgendes:
    Ich hab' um diese Projekt zu erstellen, ein neues Projekt angelegt. Da ich aber den Dialog und die Funktionalität eines Vorläuferprojekts als Ausgangsbasis für das neue Projekt haben wollte, habe ich diverse - für das neue Projekt neu erstellte - Dateien durch die des alten Projekts ersetzt und die Namen (Klassen/Methoden/...) entsprechend angepaßt. Beispiel:
    aus

    class CX302MonitorDlg : public CDialog
    

    wurde

    class CX303MonitorDlg : public CDialog
    

    Kann es daran liegen und wenn ja, wo sollte ich anfangen zu suchen?



  • Schau ob du im Konstruktor oder Destruktor evtl irgendwelche abstrakten Methoden aufrufst, welche erst später definiert werden.
    Die beiden Zeilen da alleine bringen jetzt nicht viel um das Problem zu erkennen. Da ersbt du halt von CDialog, soweit so normal



  • Ich weiss auch nicht ob das von MFC Klassen kommen kann. Verwendet die MFC überhaupt irgendwo "pure" Funktionen?

    Das einfachste wäre wohl das Programm im Debugger laufen zu lassen, und zu gucken wo es ihn zerreisst.



  • die Idee mit dem Debugger scheint wohl das Beste. Nur leider tritt der Fehler nur noch sehr selten auf...

    Vielen Dank für Eure Antworten!!


Log in to reply