Мое приложение QNX/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 учебный класс?

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам