Russian Qt Forum

Qt => Общие вопросы => Тема начата: igorskir от Май 17, 2013, 06:39



Название: Проблема с функцией сериализации в релизе.
Отправлено: igorskir от Май 17, 2013, 06:39
Добрый день.
Столкнулся с очень неожиданной проблемой, дело в том, что в Debug сборке, программа отрабатывает без ошибок, в то время как в Release сборке программа не запускается, либо запускается, но во время закрытия зависает.
Ошибка возникает при вызове функции сериализации:

Код:
void SomeClass::fillStructures()
{
   ...

   QByteArray *byteArray = new QByteArray();
   byteArray = serializationStrusct(structName1);

   ...
}

template <class T>
QByteArray* ZKPIGenerator::serializationStrusct(T var)
{
    QByteArray *byteArray = new QByteArray();
    QDataStream stream(byteArray, QIODevice::WriteOnly);
    stream << var;
    return byteArray;
}

Причем одно из полей структуры structName1 содержит в себе сериализованную этим же методом структуру structName0 , интересно то, что сериализация structName0 проходит без ошибок как в Debug, так и в Release сборке.

Спасибо.
Если будет нужно я предоставлю ранние участки кода, а так же типы полей структур.


Название: Re: Проблема с функцией сериализации в релизе.
Отправлено: Странник от Май 17, 2013, 08:12
а что это у вас память дважды выделяется, без утечек кодить скучно? = )


Название: Re: Проблема с функцией сериализации в релизе.
Отправлено: Serr500 от Май 17, 2013, 08:13
Лучше будет, если предоставите минимальный компилируемый проект, воспроизводящий ошибку. А иногда сам процесс создания такого проекта позволяет найти ошибку.  ;)


Название: Re: Проблема с функцией сериализации в релизе.
Отправлено: igorskir от Май 17, 2013, 08:34
а что это у вас память дважды выделяется, без утечек кодить скучно? = )
Память освобождалось, я не привел этот участок кода. До вашего сообщения был уверен, что утечек нет, решил просмотреть заново и действительно - в одном месте было потерянно удаление указателя....
Спасибо. Проблема решена.

P.S. где вы обнаружили в том участке, который я привел, что память не освобождается дважды? Я вижу только одну утечку внутри метода fillStructures?


Название: Re: Проблема с функцией сериализации в релизе.
Отправлено: RedDog от Май 17, 2013, 09:07

P.S. где вы обнаружили в том участке, который я привел, что память не освобождается дважды? Я вижу только одну утечку внутри метода fillStructures?
F как она может освободиться, если указатель во 2-й строчке побит?
PS: хоть 10 раз освобождай память, но указатель то потерян уже, и утечка будет. Первое new лишнее абсолютно.
PSPS: в данном случае лучше бы смарт поинтерами попользоваться


Название: Re: Проблема с функцией сериализации в релизе.
Отправлено: Igors от Май 17, 2013, 09:41
Ну набросились на (у)течку  :) ОписАлся человек или просто текст был для примера. А к делу это отношения не имеет - ошибка где-то в до месте.


Название: Re: Проблема с функцией сериализации в релизе.
Отправлено: igorskir от Май 17, 2013, 09:52
Нет, на самом деле все замечания были справедливые.
Не верная реализация:
Код:
 QByteArray *byteArray = new QByteArray();
   byteArray = serializationStrusct(structName1);
Правильнее было сделать так:
Код:
 QByteArray *byteArray = serializationStrusct(structName1);
Т.к. память выделяется внутри метода serializationStrusct.
Спасибо.


Название: Re: Проблема с функцией сериализации в релизе.
Отправлено: Странник от Май 17, 2013, 11:30
искать ошибку в отсутствующем коде я не мастер, но я бы взглянул на сами структуры и операторы сериализации-десериализации для них в QDataStream.