Russian Qt Forum
Ноябрь 24, 2024, 00:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с функцией сериализации в релизе.  (Прочитано 3534 раз)
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 сборке.

Спасибо.
Если будет нужно я предоставлю ранние участки кода, а так же типы полей структур.
Записан
Странник
Гость
« Ответ #1 : Май 17, 2013, 08:12 »

а что это у вас память дважды выделяется, без утечек кодить скучно? = )
Записан
Serr500
Гость
« Ответ #2 : Май 17, 2013, 08:13 »

Лучше будет, если предоставите минимальный компилируемый проект, воспроизводящий ошибку. А иногда сам процесс создания такого проекта позволяет найти ошибку.  Подмигивающий
Записан
igorskir
Гость
« Ответ #3 : Май 17, 2013, 08:34 »

а что это у вас память дважды выделяется, без утечек кодить скучно? = )
Память освобождалось, я не привел этот участок кода. До вашего сообщения был уверен, что утечек нет, решил просмотреть заново и действительно - в одном месте было потерянно удаление указателя....
Спасибо. Проблема решена.

P.S. где вы обнаружили в том участке, который я привел, что память не освобождается дважды? Я вижу только одну утечку внутри метода fillStructures?
Записан
RedDog
Гость
« Ответ #4 : Май 17, 2013, 09:07 »


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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 17, 2013, 09:41 »

Ну набросились на (у)течку  Улыбающийся ОписАлся человек или просто текст был для примера. А к делу это отношения не имеет - ошибка где-то в до месте.
Записан
igorskir
Гость
« Ответ #6 : Май 17, 2013, 09:52 »

Нет, на самом деле все замечания были справедливые.
Не верная реализация:
Код:
 QByteArray *byteArray = new QByteArray();
   byteArray = serializationStrusct(structName1);
Правильнее было сделать так:
Код:
 QByteArray *byteArray = serializationStrusct(structName1);
Т.к. память выделяется внутри метода serializationStrusct.
Спасибо.
Записан
Странник
Гость
« Ответ #7 : Май 17, 2013, 11:30 »

искать ошибку в отсутствующем коде я не мастер, но я бы взглянул на сами структуры и операторы сериализации-десериализации для них в QDataStream.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 23.