2015-06-25 3 views
5

У меня есть приложение 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 с жесткой плавающей точкой.

Есть идеи?

На самом деле у меня есть найти два независимых способа заставить ее работать:

  1. путем удаления деструктор SmartObject, но это не представляется возможным на общего применения.
  2. объявляя MyObject таким образом (виртуальная SmartObject и порядок перевернутый):

class MyObject : public virtual IMyInterface, public virtual SmartObject

Заранее спасибо

+0

В конструкторе 'MyObject()' вам не нужно вызывать конструкторы базового класса? –

+0

Я думаю, что они неявно называются компилятором. В любом случае ошибка сегментации происходит даже при добавлении конструкторов в IMyInterface и SmartObject и явным образом вызываю их (я только что попробовал). – ingram

ответ

-1

Вам также потребуется виртуальный деструктор для class MyObject. В противном случае вы не можете рассчитывать на надлежащее уничтожение экземпляра MyObject с помощью указателя типа IMyInterface.

+0

Я так не думаю (если вам не нужно уничтожать все, что вам не нужно деструктор). Кроме того, ошибка сегментации происходит до разрушения объекта. Тем не менее я попробовал, и он не устраняет ошибку сегментации. В любом случае, спасибо. – ingram

Смежные вопросы