bad reloc address (Keine Bibliotheken verwendet)



  • Bashar schrieb:

    Bei Templates funktioniert die √ľbliche Trennung in .h/.cpp nicht. Am einfachsten, du kopierst die Implementierungen aus tree.cpp in die tree.h.

    // TemplateClass.h
    #ifndef TEMPLATECLASS_H
    #define TEMPLATECLASS_H
    
    template<class T> class TemplateClass
    {
        public:
            TemplateClass();
    };
    
    #include "TemplateClass.cpp"
    #endif
    
    // TemplateClass.cpp
    #ifdef TEMPLATECLASS_H
    template <typename T> TemplateClass<T>::TemplateClass() {}
    #endif
    

    Oder hat das irgendwelche (mir nicht bekannten) Nachteile? Weil ich find das eigentlich ganz gut so, hoffe also dass nicht ūüėģ



  • happystudent schrieb:

    Oder hat das irgendwelche (mir nicht bekannten) Nachteile? Weil ich find das eigentlich ganz gut so, hoffe also dass nicht ūüėģ

    ist nicht das gleiche wie die Trennung in cpp/hpp



  • Ich hab mal versucht, den Workaround von happystudent zu implementieren. Die bad reloc addresses sind schon mal weg (von den Methoden), der Destruktor von TreeNode mag aber immer noch nicht:

    C:\Users\Ikaron\AppData\Local\Temp\ccXoQX1s.ltrans0.ltrans.o:ccXoQX1s.ltrans0.o:(.text+0x162): undefined reference to `TreeNode<int>::~TreeNode()'
    C:\Users\Ikaron\AppData\Local\Temp\ccXoQX1s.ltrans0.ltrans.o:ccXoQX1s.ltrans0.o:(.text+0x126): undefined reference to `TreeNode<int>::~TreeNode()'
    e:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\Ikaron\AppData\Local\Temp\ccXoQX1s.ltrans0.ltrans.o: bad reloc address 0x10 in section `.rdata'
    collect2.exe: error: ld returned 1 exit status
    

    Source code ist geupdated im ersten Post.

    Wie soll ich denn das Ganze ohne Pointer lösen @nwp3? Was ist so schlimm an new und delete, außer, dass man damit leicht Fehler macht?



  • Der Destruktor ist nirgends implementiert.



  • Bashar schrieb:

    Der Destruktor ist nirgends implementiert.

    Ich dachte, man k√∂nnte ihn einfach √ľberschreiben, wie eine Methode... Wie kann ich denn den Destruktor umleiten auf die Kindklasse?



  • Der Destruktor der Basisklasse wird vom Destruktor der Kindklasse automatisch aufgerufen. √úberschreiben hin oder her.



  • Bashar schrieb:

    Der Destruktor der Basisklasse wird vom Destruktor der Kindklasse automatisch aufgerufen. √úberschreiben hin oder her.

    Also reicht praktisch ein leerer Destruktor f√ľr sowas?
    TreeNode* node = new ChildNode();
    delete node;
    Dann wird ChildNode::~ChildNode() aufgerufen, korrekt?
    √Ąndert allerdings nichts, wenn ich statt

    virtual ~TreeNode();
    
    ~TreeNode() {};
    

    schreibe. Immer noch das gleiche Problem.



  • Ikaron schrieb:

    Bashar schrieb:

    Der Destruktor der Basisklasse wird vom Destruktor der Kindklasse automatisch aufgerufen. √úberschreiben hin oder her.

    Also reicht praktisch ein leerer Destruktor f√ľr sowas?
    TreeNode* node = new ChildNode();
    delete node;
    Dann wird ChildNode::~ChildNode() aufgerufen, korrekt?

    ja aber nur wenn der destruktor von TreeNode virtual ist.

    Und bei dir fehlt immer noch die implementierung des Destruktors von Treenode<T>



  • Hmm, ich habe den Destruktor auf virtual gesetzt, bekomme aber immer noch bad reloc address... Kannst du mir vllt bitte ein konkretes Beispiel geben, wie ich sowas mache?

    template <class A> class Base {
    
    public:
    	virtual ~Base();
    };
    
    template <class A> class Child : public Base<A> {
    
    public:
    	~Child() { /* ... */ };
    };
    

    Ist das prinzipiell richtig?



  • Ikaron schrieb:

    Hmm, ich habe den Destruktor auf virtual gesetzt, bekomme aber immer noch bad reloc address... Kannst du mir vllt bitte ein konkretes Beispiel geben, wie ich sowas mache?

    typedef <class A> class Base {
    
    public:
    	virtual ~Base();
    };
    
    typedef <class A> class Child : public Base<A> {
    
    public:
    	~Child() { /* ... */ };
    };
    

    Ist das prinzipiell richtig?

    ne da steht typedef obwohl du wohl eher template möchtest.



  • asfdlol schrieb:

    Ikaron schrieb:

    Hmm, ich habe den Destruktor auf virtual gesetzt, bekomme aber immer noch bad reloc address... Kannst du mir vllt bitte ein konkretes Beispiel geben, wie ich sowas mache?

    typedef <class A> class Base {
    
    public:
    	virtual ~Base();
    };
    
    typedef <class A> class Child : public Base<A> {
    
    public:
    	~Child() { /* ... */ };
    };
    

    Ist das prinzipiell richtig?

    ne da steht typedef obwohl du wohl eher template möchtest.

    Ehm upps, klaro, ich verwechsel die zwei immer. Tu so als w√ľrde da template stehen.



  • Ob es was bringt, dir zum dritten mal zu sagen, dass der Destruktor nicht implementiert ist? Man kanns ja mal probieren.



  • Bashar schrieb:

    Ob es was bringt, dir zum dritten mal zu sagen, dass der Destruktor nicht implementiert ist? Man kanns ja mal probieren.

    Ich verstehe nicht, was daran nicht implementiert sein soll... Habe schon versucht, deinen Tipp umzusetzen, aber am Fehler hat das nie was geändert. Außerdem meckert ja nicht mal der Compiler, sondern nur der Linker.

    ~BinaryTree() { delete root; delete comparator; };
    
    virtual ~TreeNode() {};
    ~DataNode() { delete content; delete nextLeft; delete nextRight; };
    ~ExitNode() {};
    


  • Ikaron schrieb:

    Ich verstehe nicht, was daran nicht implementiert sein soll...

    Sorry, hab nicht mitbekommen, dass du den implementiert hast. In deinen letzten Postings seh ich jedenfalls nichts davon.

    Habe schon versucht, deinen Tipp umzusetzen, aber am Fehler hat das nie was geändert.

    Das bezweifle ich. Poste doch mal die aktuelle Fehlermeldung.

    Außerdem meckert ja nicht mal der Compiler, sondern nur der Linker.

    Das ist ja auch ein typischer Linkerfehler, weil Funktionen auch in anderen Übersetzungseinheiten definiert werden können (und in der Regel auch werden.)

    ~BinaryTree() { delete root; delete comparator; };
    
    virtual ~TreeNode() {};
    ~DataNode() { delete content; delete nextLeft; delete nextRight; };
    ~ExitNode() {};
    

    Und der Linker sagt immer noch "undefined reference to TreeNode<int>::~TreeNode()"? Kann ich mir kaum vorstellen.



  • Bashar schrieb:

    Ikaron schrieb:

    Ich verstehe nicht, was daran nicht implementiert sein soll...

    Sorry, hab nicht mitbekommen, dass du den implementiert hast. In deinen letzten Postings seh ich jedenfalls nichts davon.

    Ja, ich hab ein wenig rumprobiert, aber es letztendlich wieder gestrichen, da sich nichts geändert hat.

    Bashar schrieb:

    Habe schon versucht, deinen Tipp umzusetzen, aber am Fehler hat das nie was geändert.

    Das bezweifle ich. Poste doch mal die aktuelle Fehlermeldung.

    C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o:ccLuai9r.ltrans0.o:(.text+0x137): undefined reference to `TreeNode<int>::~TreeNode()'
    C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o:ccLuai9r.ltrans0.o:(.text+0x10b): undefined reference to `TreeNode<int>::~TreeNode()'
    e:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o: bad reloc address 0x10 in section `.rdata'
    collect2.exe: error: ld returned 1 exit status
    

    Bashar schrieb:

    Außerdem meckert ja nicht mal der Compiler, sondern nur der Linker.

    Das ist ja auch ein typischer Linkerfehler, weil Funktionen auch in anderen Übersetzungseinheiten definiert werden können (und in der Regel auch werden.)

    Komisch, bei mir hat sich der Compiler vorhin erst beschwert.

    Bashar schrieb:

    ~BinaryTree() { delete root; delete comparator; };
    
    virtual ~TreeNode() {};
    ~DataNode() { delete content; delete nextLeft; delete nextRight; };
    ~ExitNode() {};
    

    Und der Linker sagt immer noch "undefined reference to TreeNode<int>::~TreeNode()"? Kann ich mir kaum vorstellen.

    Jap. Fehlermeldung steht oben.



  • Ikaron schrieb:

    Bashar schrieb:

    Ikaron schrieb:

    Ich verstehe nicht, was daran nicht implementiert sein soll...

    Sorry, hab nicht mitbekommen, dass du den implementiert hast. In deinen letzten Postings seh ich jedenfalls nichts davon.

    Ja, ich hab ein wenig rumprobiert, aber es letztendlich wieder gestrichen, da sich nichts geändert hat.

    Was hast du gestrichen? Die Implementierung?

    Bashar schrieb:

    Habe schon versucht, deinen Tipp umzusetzen, aber am Fehler hat das nie was geändert.

    Das bezweifle ich. Poste doch mal die aktuelle Fehlermeldung.

    C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o:ccLuai9r.ltrans0.o:(.text+0x137): undefined reference to `TreeNode<int>::~TreeNode()'
    C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o:ccLuai9r.ltrans0.o:(.text+0x10b): undefined reference to `TreeNode<int>::~TreeNode()'
    e:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o: bad reloc address 0x10 in section `.rdata'
    collect2.exe: error: ld returned 1 exit status
    

    Besagt eindeutig, dass der Destruktor vom Linker nicht gefunden wurde. Entweder du hast ihn nicht implementiert oder du hast ihn in einer anderen .cpp implementiert.

    Bashar schrieb:

    Komisch, bei mir hat sich der Compiler vorhin erst beschwert.

    Sicher nicht √ľber "undefined references".



  • Bashar schrieb:

    Ikaron schrieb:

    Bashar schrieb:

    Ikaron schrieb:

    Ich verstehe nicht, was daran nicht implementiert sein soll...

    Sorry, hab nicht mitbekommen, dass du den implementiert hast. In deinen letzten Postings seh ich jedenfalls nichts davon.

    Ja, ich hab ein wenig rumprobiert, aber es letztendlich wieder gestrichen, da sich nichts geändert hat.

    Was hast du gestrichen? Die Implementierung?

    Naja, ich hab alle Klammern hin und her geschoben... Aber gebracht hat es mir nicht, deswegen hab ich es jetzt einfach so gelassen, wie ich es vorhin geschrieben hab.

    Bashar schrieb:

    Bashar schrieb:

    Habe schon versucht, deinen Tipp umzusetzen, aber am Fehler hat das nie was geändert.

    Das bezweifle ich. Poste doch mal die aktuelle Fehlermeldung.

    C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o:ccLuai9r.ltrans0.o:(.text+0x137): undefined reference to `TreeNode<int>::~TreeNode()'
    C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o:ccLuai9r.ltrans0.o:(.text+0x10b): undefined reference to `TreeNode<int>::~TreeNode()'
    e:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\Ikaron\AppData\Local\Temp\ccLuai9r.ltrans0.ltrans.o: bad reloc address 0x10 in section `.rdata'
    collect2.exe: error: ld returned 1 exit status
    

    Besagt eindeutig, dass der Destruktor vom Linker nicht gefunden wurde. Entweder du hast ihn nicht implementiert oder du hast ihn in einer anderen .cpp implementiert.

    Hmm, magst du mir vllt kurz √ľber Skype helfen? Wenn ein Profi das macht geht es sicher in 5 Minuten...



  • ... Es hat sich doch schon erledigt. Ich habe, intelligent wie ich bin, noch ein Backup-Verzeichnis gehabt, wo ich brav eure Vorschl√§ge befolgt habe... Stellt sich heraus, dass das gar nicht mein Source-Verzeichnis war. Danke noch mal f√ľr die Tipps...
    (So ein Anfängerfehler, könnte mir grade echt so in's Gesicht schlagen...)



  • KN4CK3R schrieb:

    ist nicht das gleiche wie die Trennung in cpp/hpp

    Schon, aber hat das irgendwelche praktischen Auswirkungen? Ich konnte bis jetzt nämlich keine feststellen, und ob das dann hinter den Kulissen keine echte Trennung in cpp/hpp ist, ist mir dann ja eigentlich egal.

    Hauptsache ich hab halt Header und Implementierung sauber voneinander getrennt, ist sonst eben völlig inkonsistent alles in den Header zu implementieren...



  • Oft nennt man solche Template-(und inline-)Implementierungsdateien dann nicht .cpp, sondern irgendwie .inl oder so was.


Log in to reply