Название: Проблема с QSharedPointer Отправлено: Ground от Апрель 24, 2012, 11:55 Доброго времени суток!
Возникла тупиковая ситуация с QSharedPointer, которую, в принципе, я знаю как обойти, но хотелось бы понять почему не работает. Итак, что мне нужно было: У меня есть класс Base и класс Child. Мне нужно из объекта класса Child иметь возможность обращаться к объекту класса Base, с проверкой существования объекта Base. Отмечу, что мы говорим тут не про наследование. С одним объектом Base может быть связано несколько объектов Child. Оба класса не являются наследниками QObject, поэтому использовать другие типы умных указателей не вариант - они все требуют наследоваться от QObject. Как я решил задачу: Создал вектор указателей (QSharedPointer) на классы Base, и передавал в конструктор классу Child необходимый указатель. Причем передавал по значению. Что не так: При удалении первого объекта Child, удаляется и объект базового класса Base. Я ожидал совсем другого поведения от умного указателя. Хотя бы, чтобы он как-то понимал, что он не один ссылается на объект Base, и не уничтожал его при удалении объекта Child. Как можно решить эту проблему: Тут все просто, достаточно передавать в объект Child указатель на указатель, т.е. QSharedPointer<>*, но ведь это масло масляное - что-то тут не так. Хотелось бы услышать, что я не так понимаю в этих умных указателях и как дальше жить :) Название: Re: Проблема с QSharedPointer Отправлено: Igors от Апрель 24, 2012, 12:44 Что не так: При удалении первого объекта Child, удаляется и объект базового класса Base. Я ожидал совсем другого поведения от умного указателя. Хотя бы, чтобы он как-то понимал, что он не один ссылается на объект Base, и не уничтожал его при удалении объекта Child. Он и понимает, значит просто нет др ссылающихся на момент удаления ChildНазвание: Re: Проблема с QSharedPointer Отправлено: Ground от Апрель 24, 2012, 13:49 Ну а как его заставить понимать, если обычным копированием QSharedPointer<> этого сделать не получается?
Приведу пример кода: Это у нас main(): Код
Все, теперь когда мы удалим первый объект Child, все остальные уже будут выдавать сегфолт. Название: Re: Проблема с QSharedPointer Отправлено: Igors от Апрель 24, 2012, 14:11 Все, теперь когда мы удалим первый объект Child, все остальные уже будут выдавать сегфолт. Не должны, выложите минимальный проект (возможно найдете ошибку когда будете его делать)Название: Re: Проблема с QSharedPointer Отправлено: Ground от Апрель 24, 2012, 15:45 Действительно, вы правы. На минимальном проекте подобной ошибки нет, все работает корректно. А в моем проекте 3 вектора с Child-классами, два удаляются нормально, а третий падает с сегфолтом - хотя все практически эквивалентны.
Спасибо за пинок в нужном направлении, дальше буду думать сам |