gpt4 book ai didi

c++ - ARM交叉编译,多重继承段错误

转载 作者:IT王子 更新时间:2023-10-29 00:40:37 24 4
gpt4 key购买 nike

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

类 MyObject :公共(public)虚拟 IMyInterface,公共(public)虚拟 SmartObject

提前致谢

最佳答案

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

关于c++ - ARM交叉编译,多重继承段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31048919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com