2015-06-25 20 views
5

Ich habe eine C++ - Anwendung, die Mehrfachvererbung und Polymorphismus verwendet. Es funktioniert korrekt auf x86_64-Linux, aber auf Arm-Linux erlebe ich einen Segmentierungsfehler.ARM-Kreuzkompilierung, Segmentierungsfehler bei Mehrfachvererbung

Ich habe einen einfachen Test geschrieben, das Problem neu zu erstellen:

#include <list> 
#include <iostream> 

class SmartObject 
{ 
    public: 

    // removing this destructor makes it work in ANY way 
    virtual ~SmartObject(){ 
    } 

    void method(void) {} 
}; 

class IMyInterface 
{ 
    public: 

    // removing this destructor have no effect (fails) 
    virtual ~IMyInterface(){ 
    } 

    virtual std::list<int> getList() = 0; 
}; 

class MyObject : public SmartObject, public virtual IMyInterface 
{ 
    public: 

    MyObject() 
    { 
     list.push_back(4); 
     list.push_back(5); 
    } 

    virtual std::list<int> getList() { 
     return list; 
    } 

    std::list<int> list; 
}; 

int main() 
{ 
    IMyInterface * ip = new MyObject(); 
    std::list<int> list_clone = ip->getList(); 
    std::cout << list_clone.size() << std::endl; 
    delete ip; 
    return 0; 
} 

Dieser Code funktioniert korrekt auf x64-Linux und win32 (auch auf anderen Embedded-Plattformen), sondern auf Arm-linux es verursacht Segmentierungsfehler beim Aufruf von list_clone.size(), weil die kopierte Liste einen falschen Tail-Zeiger hat.

Ich habe mit gcc 4.8.3 und 4.9.1 versucht, aber ich habe das gleiche Verhalten gesehen. Die Zielarchitektur sind ARM Cortex-A-Prozessoren mit hartem Gleitkomma.

Irgendeine Idee?

Eigentlich habe ich zwei unabhängige Wege finden, damit es funktioniert:

  1. durch den Smartobject destructor zu entfernen, aber dies ist auf die allgemeine Anwendung nicht möglich ist.
  2. von MyObject auf diese Weise (virtual auf Smartobject und Ordnung invertiert) erklärt:

class MyObject : public virtual IMyInterface, public virtual SmartObject

Vielen Dank im Voraus

+0

In 'MyObject()' -Konstruktor, müssen Sie nicht die Basisklasse Konstruktoren aufrufen? –

+0

Ich denke, dass sie implizit Compiler genannt werden. Wie dem auch sei, der Segmentierungsfehler tritt auf, wenn sogar Konstruktoren in IMyInterface und SmartObject hinzugefügt werden und diese explizit aufgerufen werden (ich habe es gerade versucht). – ingram

Antwort

-1

Sie werden auch für class MyObject benötigen einen virtuellen Destruktor. Andernfalls können Sie nicht erwarten, eine MyObject Instanz durch einen Zeiger vom Typ IMyInterface ordnungsgemäß zu zerstören.

+0

Ich glaube nicht (wenn du nichts zerstören musst, brauchst du keinen Destruktor). Außerdem tritt der Segmentierungsfehler vor der Objektzerstörung auf. Trotzdem habe ich es ausprobiert und den Segmentierungsfehler nicht behoben. Trotzdem danke. – ingram