我的 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 的虚拟析构函数的实现。
我正在开发 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 的虚拟析构函数的实现。