【发布时间】: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 处理器。
有什么想法吗?
其实我已经找到了两种独立的方法来让它工作:
- 通过删除 SmartObject 析构函数,但这在 整体应用。
- 通过以这种方式声明 MyObject(在 SmartObject 上虚拟并反转顺序):
class MyObject : public virtual IMyInterface, public virtual SmartObject
提前致谢
【问题讨论】:
-
在
MyObject()构造函数中,不需要调用基类构造函数吗? -
我认为它们被隐式称为编译器。无论如何,即使在 IMyInterface 和 SmartObject 中添加构造函数并显式调用它们(我刚刚尝试过),也会发生分段错误。
标签: c++ linux gcc arm multiple-inheritance