Здравствуйте. Возникла непонятная проблема. Код довольно громоздок, т.к. проект немаленький. Поэтому попробую описать словами и маленькими вставками псевдокода.
Есть класс десериализатор (CPacket), который при помощи метода FromBinary заполняет из "двоичных" данных на входе (const char* buf, int len) свои собственные поля.
Есть еще один класс (CNetworkSession), класс создает объект QUdpSocket, и ловит из него датаграммы.
По факту прихода новой датаграммы CNetwork генерирует сигнал (onNewPacket) и передает туда массив char* и его длину int length.
Т.е если псевдокодом описать:
C++ (Qt)
CNetworkSession::CNetworkSession()
{
this->udpSocket = new QUdpSocket();
this->udpSocket->bind(...);
connect(this->udpSocket, SIGNAL(readyRead()), this, SLOT(NewPacketRecv()));
...
}
void CNetworkSession::NewPacketRecv()
{
char* buf = (char*)malloc(...);
int len = this->UdpSocket->readDatagram(...);
if (len > 0)
{
buf = (char*)realloc(buf, len);
emit this->onNewPacket(buf, len);
}
}
Ну и есть, соответственно, третий класс который уже ловит сигнал onNewPacket(...) от CNetworkSession, применяет класс десериализатор CPacket, ну и в общем далее делает что хочет с этими структурированными данными.
примерно таким образом:
C++ (Qt)
void CEndpointClass::SlotOnNewPacket(char* buf, int len)
{
CPacket packet;
packet.FromBinary(buf, len);
int someValue = packet.getSomeValue(); // <----- trouble
}
В общем, когда вызывается packet.FromBinary() внутри него все данные десериализуются правильно (трассировка + watch показали).
когда далее в someValue происходит присвоение packet.getSomeValue(), в someValue попадают абсолютно неверные данные.
если идти трассировкой в слоте SlotOnNewPacket и посмотреть в Watch значения объекта packet какбы из слота, то там тоже неверные данные. Причем они такие, как будто в структуре класса произошло некое смещение.
Если унаследовать CPacket от QObject и добавить к нему макрос Q_OBJECT, при трассировке из слота в объекте поля становятся верными.
но в intSomeValue всё равно попадает какая-то фигня.
getSomeValue() - это обычный геттер приватного свойства.
Подскажите пожалуйста, что за магия такая
Самое фиговое, что всё это выполняется в одном трэде и не распараллеливалось (да и не нужно). Я бы понял, если бы что-то подобное творилось между разными тредами.
Прям расстраивает Qt во времена таких диких странностей.