0

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

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

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

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

当我在被调用函数返回后访问_computerNameor成员变量时发生崩溃。_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课可能有什么问题?

4

1 回答 1

0

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

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

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

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

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

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

于 2016-02-01T14:20:22.400 回答