g++: pure virtual method called ???



  • Der hat irgendwie die vtable unterwegs verloren. Das ist IMHO auf keine Fall ein Exception Problem.



  • Eigentlich hatte ich zuerst in Entity eine default-implementierung von appendField() die ich in CsEntity ueberschrieben hatte... CsEntity::appendField wurde aber nie aufgerufen (???) immer nur Entity::appendField.

    Dann habe ich die default-implementierung weggemacht und nun kommt dieses pure-virtual-function-called...

    Mit der VTABLE stimmt da wirklich was nicht...



  • edit: Müll

    btw: Das throw kannst Du auf keinen Fall so lassen, es sei denn Du fängst alle Exceptions die nicht fliegen dürfen selbst auf oä, was aber eher mühsam werden dürfte...



  • Ich habe die throw()s uberall im Programm...

    Eigentlich fange ich ueberall im Programm Exceptions, die nicht fliegen _sollen_ ab.

    Endererseits kann es naturlich passieren, das ein bad_alloc Fliegt, oder wie weiter oben geschrien, vector::push_back eine excaption wirft. In so einem Fall denke ich, kann dass Program eh nicht vernunftig weiter abgearbeitet werden und sollte terminieren (wass es dann auch macht).

    Sobald irgentwo eine excepotion fliegt, die ich nicht erwarte (also nicht in der throw() liste der funktion steht), so behaupte ich, kann das Program nich vernunftig weitermachen.



  • Wie sieht eigentlich der Stacktrace vor #8 aus?



  • Nein, dass Problem liegt glaube ich woanders. Hast du für beide Klassen eine Code (.cpp;.cc etc.) Datei oder nur Header? Weil C++ Compiler idr. in den Objekt Dateien die virtuellen Tabellen erzeugen, wenn nun aber keine vorhanden ist, wird keine erstellt, also auch keine hinzugelinkt.



  • @kingruedi:

    Ja. Klassen Entity und CsEntity sind jede in einer .h Datei deklariert, implementiert sind jede in einer cpp Datei.

    @Ponto:

    Der komplette stacktrace ist

    (ich habe ihn vorhin nicht komplett gepostet, da ich nur teile des codes gepostet habe)

    #0  0x4034fb71 in kill () from /lib/i686/libc.so.6
    #1  0x404a8cf1 in pthread_kill ()
       from /lib/i686/libpthread.so.0
    #2  0x404a900b in raise () from /lib/i686/libpthread.so.0
    #3  0x4034f904 in raise () from /lib/i686/libc.so.6
    #4  0x40350e8c in abort () from /lib/i686/libc.so.6
    #5  0x402d1305 in __cxxabiv1::__terminate(void (*)()) ()
       from /usr/lib/libstdc++.so.5
    #6  0x402d1342 in std::terminate() ()
       from /usr/lib/libstdc++.so.5
    #7  0x402d1855 in __cxa_pure_virtual ()
       from /usr/lib/libstdc++.so.5
    #8  0x0806a15f in Entity::readFromDb() (this=0xbfffe940)
        at entity.cpp:85
    #9  0x080688c9 in Entity (this=0xbfffe940, db=
          {mObject = 0x809b3b8}, trans={mObject = 0x80a4f90},
        infoStore=@0xbfffebb4, session=66, direction=1, name=
            {static npos = 4294967295, _M_dataplus = {<allocator<char>> = {<No data fields>}, _M_p = 0x80a7104 "TEST"}, static _S_empty_rep_storage = {0, 0, 9, 0}}, id=169) at entity.cpp:23
    #10 0x0807db97 in CsEntity (this=0xbfffe940, db=
          {mObject = 0x809b3b8}, trans={mObject = 0x80a4f90},
        infoStore=@0xbfffebb4, session=66, direction=1, name=Cannot access memory at address 0x6
    )
        at cs_entity.cpp:51
    #11 0x0805b4b1 in Client::upload() (this=0xbfffeb90)
        at client.cpp:270
    #12 0x08059d30 in Client::main() (this=0xbfffeb90)
        at client.cpp:96
    #13 0x08053a04 in TestBase::runClient(IBPP::Ptr<IBPP::IDatabase>, std::string) (this=0xbffff270, db={mObject = 0x809b3b8},
        user=
            {static npos = 4294967295, _M_dataplus = {<allocator<char>> = {<No data fields>}, _M_p = 0x809b184 "A"}, static _S_empty_rep_storage = {0, 0, 9, 0}}) at test_base.cpp:385
    #14 0x0804c823 in Basic::main() (this=0xbffff270)
        at basic.cpp:64
    #15 0x08052576 in TestBase::perform() (this=0xbffff270)
        at test_base.cpp:241
    #16 0x0804ca93 in main (argc=1, argv=0xbffff2e4)
        at basic.cpp:75
    


  • Hast du etwa die Methode readFromDb() im Konstruktor von Entity aufgerufen?
    Wenn ja, dann hast du deinen Fehler.
    Wenn nein, dann sind die Funktionen um cs_entity.cpp:51, client.cpp:270, entity.cpp:23 von Bedeutung.



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke erstmals an alle die mir geantwortet haben...

    @Ponto

    Das readFromDb() habe ich im Constructor aufgerufen... Nachdem ich das weggemacht habe, funktionierts!

    Und noch eine Frage: wieso darf man eigentlich das readFromDb() im CTOR nicht aufrufen?

    Entity::Entity(IBPP::Database db, IBPP::Transaction trans, EntityInfoStore& infoStore, __int64 session, int direction, std::string name, __int64 id) throw(IBPP::Exception, EntityException) :
    	m_db(db), m_trans(trans), m_name(name), m_id(id), m_store(infoStore), m_session(session), m_direction(direction)
    {
    	readFromDb();
    }
    


  • ubu_roi schrieb:

    Danke erstmals an alle die mir geantwortet haben...

    @Ponto
    Und noch eine Frage: wieso darf man eigentlich das readFromDb() im CTOR nicht aufrufen?

    Weil das readFromDb eine virtual Funktion aufruft. Das Objekt jedoch, dessen Funktion der virtuelle Aufruf starten würde, existiert jedoch noch nicht. CsEntity exisitert erst genau dann, wenn in dessen Konstruktor reingegangen wird. Der Konstruktor von Entity als Basisklasse wird jedoch davor aufgerufen.


Anmelden zum Antworten