2017-02-13 10 views
0

Я использую qt5.5.1 с qt-creator 3.5.1 и пытаюсь установить стиль на GeoDataPlacemark с GeoDataStyle. Он работал нормально, но после обновления Marble для использования общих указателей вместо прямых указателей моя программа seg faults. Используя GDB, я проследил ошибку seg в строке, где я создаю QSharedPointer с прямым указателем styleArch. Кто-нибудь есть идея, что может быть проблемой?Seg Ошибка при использовании QSharedPointers в qt5

Мой старый код следующим образом:

styleArch->setIconStyle(*icon); 
place->setStyle(styleArch); //Old Marble 

Новый код, который использует новый Marble API выглядит следующим образом:

styleArch->setIconStyle(*icon); 
place->setStyle(Marble::GeoDataStyle::Ptr(styleArch)); //New Marble 

Спасибо за ваше время!

ответ

1

Строка: Marble::GeoDataStyle::Ptr(styleArch) создает временный QSharedPointer и передает его styleArch как указатель. QSharedPointer получает право собственности на styleArch * в этот момент, что означает, что все, что ранее принадлежало styleArch *, больше не имеет его.

Метод setStyle принимает ссылку на константный к временному QSharedPointer вы только что создали и использует его на короткое время, но, что важно, не увеличивает счетчик ссылок на QSharedPointer в (потому что это Const).

Это означает, что как только вызов setStyle завершится, временный QSharedPointer выходит из области действия (вызывает его деструктор) и удаляет объект styleArch из кучи. Это оставляет вас в плохом состоянии, потому что первоначальный владелец styleArch * понятия не имеет, что теперь он имеет недопустимый указатель. Любое дальнейшее использование styleArch * должно segfault.

Самое простое исправление - обновить владельца styleArch *, чтобы вместо этого использовать стиль QSharedPointer <>.

+0

привет, спасибо за ваш быстрый ответ! Ваш комментарий указал мне в правильном направлении. Я создал новую переменную типа QSharedPointer следующим образом: 'styleArchSP = QSharedPointer (новый GeoDataStyle); styleArchSP-> комплектIconStyle (* значок); место-> комплектStyle (styleArchSP); ' –

+0

Точно. Создавая экземпляр sharedpointer как styleArchSP, вы гарантируете, что его жизненный цикл выходит за пределы вызова setStyle. Помогло ли это решить проблему с seg fault? –

+0

Да, это так. Большое спасибо! –