Я работаю над приложением QNX / Blackberry 10. Мое приложение недавно начало падать. Вставка трассировочных операторов привела меня к мысли, что сбой происходит в следующей ситуации.
Мое клиентское приложение вызывает внутреннюю функцию, передавая ей ссылку на объект класса C ++. Переданный класс C ++ выглядит следующим образом:
class ALPeerData
{
public:
ALPeerData ();
virtual ~ALPeerData ();
int _peerId;
ALModelType _modelType;
std::wstring _computerName;
std::wstring _uuidDevice;
. . .
};
Сбой происходит, когда я получаю доступ к _computerName
или же _uuidDevice
переменные-члены после вызываемой функции возвращают его. Следы в вызываемой функции показывают ALPeerData
переменные-члены объекта соответствуют ожиданиям. Таким образом, _computerName.size()
внутри функции возвращает что-то разумное, например 10, но при вызове в клиентском приложении возвращает размер около 23 МБ. 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 есть проблема с реализацией стандарта C ++ в его компиляторе gcc / qcc.
Ключевое слово «virtual» в объявлении деструктора ALPeerData не является необходимым и избыточным, поскольку никакой класс в моем приложении не является производным от него. Это не должно иметь никакого значения — мне нужно разрешить указывать «виртуальный» для любого деструктора, который мне нравится.
На самом деле, указав «виртуальный» для ALPeerData
деструктор вызывает генерирование неверного двоичного кода. Таким образом, доступ к переменным-членам приводит к ненужным результатам.
Когда я удалил лишнее ключевое слово «virtual», сбой исчез.
Это не первый раз, когда я сталкиваюсь с проблемой реализации QNX виртуальных деструкторов C ++. Первый раз можно увидеть в предыдущий мой пост StackOverflow.
Суть в том, что нужно проявлять осторожность в реализации QNX виртуальных деструкторов.
Других решений пока нет …