127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Smart pointer02.09.2015, 08:53. Показов 2433. Ответов 6
Доброго времени суток.
Вопросы мои связаны с началом изучения умных указателей в C++ и применении в проектах. Взял за начало обучения статью на хабре http://habrahabr.ru/post/140222/ 1. В статье написано инициализация указателя
Вопрос в следующем, как мне в таком же стиле применить shared_ptr? Правильно ли будет писать так:
В одном из проектов необходимо использовать следующую конструкцию. Есть класс Книга, в которой есть поля название, автор и прочее. Есть класс Комната, в которой есть вектор, содержащий указатели на книги, находящиеся в данной комнате. Есть управляющий класс Агент, который следит за передвижением книг. Суть какая, при запуске Агент создает комнаты, и в дальнейшем создает книги. Затем он их должен положить в комнату. Правильно ли будет использовать в данном случае умные указатели (ибо я боюсь запутаться в указателях), и создав shard_ptr<Book> book1 (new Book ("Bukvar")); затем передать его в комнату. а при необходимости взять оттуда? 3. этот вопрос больше касается Qt, но не охото плодить темы, возможно здесь ответят. Как Qt дружит с std::shared_ptr? Я например окошки создаю так:
Заранее благодарен.
0
|
02.09.2015, 08:53 | |
Ответы с готовыми решениями:
6
Smart pointer Создание Smart pointer smart pointer с указателем на new[] Smart pointer и двумерный массив |
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
02.09.2015, 09:09 | 2 | |||||
Сообщение было отмечено Воротислав как решение
Решение
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|||||||||||
02.09.2015, 09:34 | 3 | ||||||||||
Сообщение было отмечено Воротислав как решение
Решение
Если ты будешь указывать родителя в конструкторе создаваемого объекта, то этот родитель при своем уничтожении будет пытаться уничтожить также и свои дочерние объекты. Если дочерний объект сидит в shared_ptr, то это уничтожение останется незамеченным для него. И он будет продолжать считать, что ссылается на валидный объект.
Т.е. ситуация эквивалентна такой:
Добавлено через 2 минуты Конкретно в приведенном коде shared_ptr вообще-то избыточен. Достаточно сделать так:
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
02.09.2015, 10:11 | 4 | |||||
Воротислав, Инициализировать лучше в списке инициализации, а не в конструкторе непосредственно.
1
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
||||||
02.09.2015, 11:02 [ТС] | 5 | |||||
ForEveR, а через make_shared будет выглядеть так:
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
02.09.2015, 11:03 | 6 |
Сообщение было отмечено Воротислав как решение
Решение
Воротислав, Угу. Или так же в конструкторе инициализации. Или прям в классе, если поддерживается инициализация в классе.
1
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|
02.09.2015, 11:04 [ТС] | 7 |
Понял, пойду пробовать, учиться. Всем большое спасибо!
0
|
02.09.2015, 11:04 | |
02.09.2015, 11:04 | |
Помогаю со студенческими работами здесь
7
Thread-safe smart pointer Shared_ptr - stored pointer, owned pointer delete[] *pointer vs. delete pointer и утечка памяти pointer - pointer Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |