【问题标题】:ARM cross-compiling, segmentation fault on multiple inheritanceARM交叉编译,多重继承上的分段错误
【发布时间】:2015-06-25 11:20:20
【问题描述】:

我有一个使用多重继承和多态性的 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 上虚拟并反转顺序):

class MyObject : public virtual IMyInterface, public virtual SmartObject

提前致谢

【问题讨论】:

  • MyObject()构造函数中,不需要调用基类构造函数吗?
  • 我认为它们被隐式称为编译器。无论如何,即使在 IMyInterface 和 SmartObject 中添加构造函数并显式调用它们(我刚刚尝试过),也会发生分段错误。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您还需要class MyObject 的虚拟析构函数。 否则,您不能期望通过 IMyInterface 类型的指针正确地破坏 MyObject 实例。

    【讨论】:

    • 我不这么认为(如果你不需要销毁任何东西,你就不需要析构函数)。此外,分段错误发生在对象破坏之前。尽管如此,我尝试过它并没有消除分段错误。还是谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2014-06-13
    • 1970-01-01
    • 2016-05-26
    • 2013-01-19
    • 2021-02-17
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多