У меня есть приложение C++, использующее множественное наследование и полиморфизм. Он корректно работает на x86_64-linux, но на arm-linux я испытываю ошибку сегментации.Кросс-компиляция ARM, ошибка сегментации при множественном наследовании
Я написал простой тест, чтобы воссоздать проблему:
#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;
}
Этот код правильно работает на x64-Linux и win32 (также на других встраиваемых платформах), но на руку-Linux это вызывает segmentation fault при вызове list_clone.size(), поскольку скопированный список имеет неправильный указатель на хвост.
Я пробовал с gcc 4.8.3 и 4.9.1, но я видел такое же поведение. Целевая архитектура - это процессоры ARM cortex-A с жесткой плавающей точкой.
Есть идеи?
На самом деле у меня есть найти два независимых способа заставить ее работать:
- путем удаления деструктор SmartObject, но это не представляется возможным на общего применения.
- объявляя MyObject таким образом (виртуальная SmartObject и порядок перевернутый):
class MyObject : public virtual IMyInterface, public virtual SmartObject
Заранее спасибо
В конструкторе 'MyObject()' вам не нужно вызывать конструкторы базового класса? –
Я думаю, что они неявно называются компилятором. В любом случае ошибка сегментации происходит даже при добавлении конструкторов в IMyInterface и SmartObject и явным образом вызываю их (я только что попробовал). – ingram