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:
- durch den Smartobject destructor zu entfernen, aber dies ist auf die allgemeine Anwendung nicht möglich ist.
- 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
In 'MyObject()' -Konstruktor, müssen Sie nicht die Basisklasse Konstruktoren aufrufen? –
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