blackberry 10 — мое приложение CNX / BB10 C ++ аварийно завершает работу, кажется, что простой объект C ++ поврежден

Я работаю над приложением 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 учебный класс?

0

Решение

Оказывается, что у QNX есть проблема с реализацией стандарта C ++ в его компиляторе gcc / qcc.

Ключевое слово «virtual» в объявлении деструктора ALPeerData не является необходимым и избыточным, поскольку никакой класс в моем приложении не является производным от него. Это не должно иметь никакого значения — мне нужно разрешить указывать «виртуальный» для любого деструктора, который мне нравится.

На самом деле, указав «виртуальный» для ALPeerDataдеструктор вызывает генерирование неверного двоичного кода. Таким образом, доступ к переменным-членам приводит к ненужным результатам.

Когда я удалил лишнее ключевое слово «virtual», сбой исчез.

Это не первый раз, когда я сталкиваюсь с проблемой реализации QNX виртуальных деструкторов C ++. Первый раз можно увидеть в предыдущий мой пост StackOverflow.

Суть в том, что нужно проявлять осторожность в реализации QNX виртуальных деструкторов.

0

Другие решения

Других решений пока нет …