ARM交叉编译,多重继承的分段错误

时间:2015-06-25 11:20:21

标签: c++ linux gcc arm multiple-inheritance

我有一个使用多重继承和多态的C ++应用程序。它在x86_64-linux上正常工作但在arm-linux上我遇到了分段错误。

我写了一个简单的测试来重新创建问题:

#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(也适用于其他嵌入式平台)上正常工作但在arm-linux上调用list_clone.size()时会导致分段错误,因为复制的列表尾部指针不正确。

我尝试过使用gcc 4.8.3和4.9.1,但我看到过相同的行为。目标架构是具有硬浮点的ARM cortex-A处理器。

有什么想法吗?

实际上我找到了两种独立的方法来实现它:

  1. 删除SmartObject析构函数,但这不可行 整体申请。
  2. 以这种方式声明MyObject(在SmartObject上虚拟并反转顺序):
  3. class MyObject : public virtual IMyInterface, public virtual SmartObject

    提前致谢

2 个答案:

答案 0 :(得分:2)

这是ARM目标上的gcc 4.9.X的错误。见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66666-

答案 1 :(得分:-1)

您还需要MyObject的虚拟析构函数。 否则,您不能期望通过类型为IMyInterface的指针正确地破坏 <input type="hidden" ng-model="searchCategory" > <!-- Categories --> <nav class="widget" > <h4>Product Categories</h4> <ul class="categories" ng-repeat="category in categories"> <li><a href ng-click="getProducCategory().searchCategory=category.category" >{{category.category}}</a></li> </ul> </nav> 实例。