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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с QSharedPointer  (Прочитано 7017 раз)
Ground
Гость
« : Апрель 24, 2012, 11:55 »

Доброго времени суток!
Возникла тупиковая ситуация с QSharedPointer, которую, в принципе, я знаю как обойти, но хотелось бы понять почему не работает.
Итак, что мне нужно было: У меня есть класс Base и класс Child. Мне нужно из объекта класса Child иметь возможность обращаться к объекту класса Base, с проверкой существования объекта Base. Отмечу, что мы говорим тут не про наследование. С одним объектом Base может быть связано несколько объектов Child. Оба класса не являются наследниками QObject, поэтому использовать другие типы умных указателей не вариант - они все требуют наследоваться от QObject.
Как я решил задачу: Создал вектор указателей (QSharedPointer) на классы Base, и передавал в конструктор классу Child необходимый указатель. Причем передавал по значению.
Что не так: При удалении первого объекта Child, удаляется и объект базового класса Base. Я ожидал совсем другого поведения от умного указателя. Хотя бы, чтобы он как-то понимал, что он не один ссылается на объект Base, и не уничтожал его при удалении объекта Child.
Как можно решить эту проблему: Тут все просто, достаточно передавать в объект Child указатель на указатель, т.е. QSharedPointer<>*, но ведь это масло масляное - что-то тут не так.

Хотелось бы услышать, что я не так понимаю в этих умных указателях и как дальше жить Улыбающийся
« Последнее редактирование: Апрель 24, 2012, 11:59 от Ground » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 24, 2012, 12:44 »

Что не так: При удалении первого объекта Child, удаляется и объект базового класса Base. Я ожидал совсем другого поведения от умного указателя. Хотя бы, чтобы он как-то понимал, что он не один ссылается на объект Base, и не уничтожал его при удалении объекта Child.
Он и понимает, значит просто нет др ссылающихся на момент удаления Child
Записан
Ground
Гость
« Ответ #2 : Апрель 24, 2012, 13:49 »

Ну а как его заставить понимать, если обычным копированием QSharedPointer<> этого сделать не получается?
Приведу пример кода:
Это у нас main():
Код
C++ (Qt)
// Это наши объекты с SharedPointer. Сейчас они все указывают на null.
QSharedPointer<Base> baseObject; // 1 базовый объект
QVector<QSharedPointer<Child> > childObjects(3); // 3 child-объекта
 
baseObject = QSharedPointer<Base>(new Base());
// Создадим три дочерних объекта. В качестве аргумента передадим QSharedPointer на Base-класс
for (int i = 0; i < childObjects.size(); i++)
    childObjects[i] = QSharedPointer<Child>(new Child(baseObject));
 
// Конструктор Child
Child::Child(QSharedPointer<Base> baseObject)
{
   mBaseObject = baseObject; // Сохраним наш указатель
}
 

Все, теперь когда мы удалим первый объект Child, все остальные уже будут выдавать сегфолт.
« Последнее редактирование: Апрель 24, 2012, 13:51 от Ground » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 24, 2012, 14:11 »

Все, теперь когда мы удалим первый объект Child, все остальные уже будут выдавать сегфолт.
Не должны, выложите минимальный проект (возможно найдете ошибку когда будете его делать)
Записан
Ground
Гость
« Ответ #4 : Апрель 24, 2012, 15:45 »

Действительно, вы правы. На минимальном проекте подобной ошибки нет, все работает корректно. А в моем проекте 3 вектора с Child-классами, два удаляются нормально, а третий падает с сегфолтом - хотя все практически эквивалентны.
Спасибо за пинок в нужном направлении, дальше буду думать сам
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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