我的QNX/BB10 C++应用程序崩溃,一个简单的C++对象似乎已损坏
问题描述:
我正在研究QNX/Blackberry 10应用程序。我的应用程序最近开始崩溃。插入跟踪语句导致我相信在以下情况下会发生崩溃。我的QNX/BB10 C++应用程序崩溃,一个简单的C++对象似乎已损坏
我的客户端应用程序调用一个内部函数,并将它传递给一个C++类对象。传递的C++类如下所示:当我访问_computerName
或_uuidDevice
成员变量调用函数返回后出现
class ALPeerData
{
public:
ALPeerData();
virtual ~ALPeerData();
int _peerId;
ALModelType _modelType;
std::wstring _computerName;
std::wstring _uuidDevice;
. . .
};
崩溃。被调用函数中的跟踪显示ALPeerData
对象成员变量符合预期。因此,该函数内的_computerName.size()
返回一些合理的东西,例如10,但在客户端应用程序中调用时返回的大小约为23 MB。 The ALPeerData
对象似乎已损坏。
我在这里列出了文档的原因QCC -V输出:
user:~$ qcc -V
cc: targets available in /home/bbndk/host_10_3_1_12/linux/x86/etc/qcc:
4.6.3,gcc_ntoarmv7le_gpp
4.6.3,gcc_ntox86_gpp
4.6.3,gcc_ntoarmv7le_cpp-ne
4.6.3,gcc_ntoarmv7le_cpp
4.6.3,gcc_ntox86 (default)
4.6.3,gcc_ntoarmv7le
4.6.3,gcc_ntox86_cpp-ne
4.6.3,gcc_ntox86_cpp
4.8.3,gcc_ntoarmv7le_gpp
4.8.3,gcc_ntox86_gpp
4.8.3,gcc_ntoarmv7le_cpp-ne
4.8.3,gcc_ntoarmv7le_cpp
4.8.3,gcc_ntox86
4.8.3,gcc_ntoarmv7le
4.8.3,gcc_ntox86_cpp-ne
4.8.3,gcc_ntox86_cpp
user:~$
可能是什么毛病我ALPeerData
类?
答
事实证明,QNX在其gcc/qcc编译器中实现C++标准时存在问题。
ALPeerData的析构函数声明中的'virtual'关键字不是必需的和多余的,因为我的应用程序中没有任何类派生它。这应该没有什么区别 - 我应该被允许为我所要的任何析构函数指定'虚拟'。
实际上,为ALPeerData
的析构函数指定'虚拟'会导致生成不正确的二进制代码。因此,访问成员变量会导致垃圾结果。
当我删除多余的'虚拟'关键字时,崩溃消失了。
这不是我第一次遇到QNX实现C++虚拟析构函数的问题。第一次可以在previous StackOverflow post of mine中看到。
底线:对QNX的虚拟析构函数的实现需要警惕。
我不明白。如果你的主类不是从其他派生的,为什么你声明析构函数是虚拟的。 –
我添加了'虚拟'关键字来帮助未来从ALPeerData派生的另一位开发人员。使其虚拟化避免了基础析构函数没有被调用的常见错误。根据官方C++规范,这是完全良性的。请参阅http://stackoverflow.com/questions/300986/when-should-you-not-use-virtual-destructors关于使所有析构函数变为虚拟的讨论。 另一个理论场景:假设派生类_had_是从ALPeerData派生的,但后来在重构期间从代码中移除,而没有从ALPeerData中删除虚拟关键字。 –
Ahhhhhhhhh .......我明白了。 Muchas gracias,阿米戈。 –