我的 QNX/BB10 C++ 应用程序崩溃,一个简单的 C++ 对象似乎已损坏

My QNX/BB10 C++ application crashes, a simple C++ object seems to be corrupted

我正在开发 QNX / Blackberry 10 应用程序。我的应用程序最近开始崩溃。插入跟踪语句使我相信崩溃是在以下情况下发生的。

我的客户端应用程序调用一个内部函数,将其传递给 C++ class 对象的引用。传递的 C++ class 如下所示:

class ALPeerData
{
public:
    ALPeerData ();
    virtual ~ALPeerData ();

    int            _peerId;
    ALModelType    _modelType;
    std::wstring   _computerName;
    std::wstring   _uuidDevice;
    . . .
};

当我在调用函数returns之后访问_computerName_uuidDevice成员变量时发生崩溃。被调用函数中的跟踪显示 ALPeerData 对象成员变量符合预期。因此,函数 returns 中的 _computerName.size() 类似于 10,但在客户端应用程序中调用时 returns 大小约为 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 class 有什么问题吗?

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

ALPeerData 的析构函数声明中的 'virtual' 关键字不是必需的而且是多余的,因为我的应用程序中没有 class 派生自它。这应该没有任何区别——我应该被允许为我喜欢的任何析构函数指定 'virtual'。

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

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

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

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