2016-02-01 89 views
0

我正在研究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类?

回答

0

事实证明,QNX在其gcc/qcc编译器中实现C++标准时存在问题。

ALPeerData的析构函数声明中的'virtual'关键字不是必需的和多余的,因为我的应用程序中没有任何类派生它。这应该没有什么区别 - 我应该被允许为我所要的任何析构函数指定'虚拟'。

实际上,为ALPeerData的析构函数指定'虚拟'会导致生成不正确的二进制代码。因此,访问成员变量会导致垃圾结果。

当我删除多余的'虚拟'关键字时,崩溃消失了。

这不是我第一次遇到QNX实现C++虚拟析构函数的问题。第一次可以在previous StackOverflow post of mine中看到。

底线:对QNX的虚拟析构函数的实现需要警惕。

+0

我不明白。如果你的主类不是从其他派生的,为什么你声明析构函数是虚拟的。 –

+0

我添加了'虚拟'关键字来帮助未来从ALPeerData派生的另一位开发人员。使其虚拟化避免了基础析构函数没有被调用的常见错误。根据官方C++规范,这是完全良性的。请参阅http://stackoverflow.com/questions/300986/when-should-you-not-use-virtual-destructors关于使所有析构函数变为虚拟的讨论。 另一个理论场景:假设派生类_had_是从ALPeerData派生的,但后来在重构期间从代码中移除,而没有从ALPeerData中删除虚拟关键字。 –

+0

Ahhhhhhhhh .......我明白了。 Muchas gracias,阿米戈。 –