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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: [Решено] Использование std::shared_ptr и std::unique_ptr c Qt объектами  (Прочитано 24152 раз)
carrygun
Гость
« Ответ #30 : Июнь 19, 2014, 10:25 »

Igors, смысл в том, чтобы везде использовать shared_ptr вместо обычных указателей.

А в чем от этого смысл?
Записан
8Observer8
Гость
« Ответ #31 : Июнь 19, 2014, 10:31 »

Igors, смысл в том, чтобы везде использовать shared_ptr вместо обычных указателей.
А в чем от этого смысл?
К примеру, чтобы не бояться забыть написать delete. Есть и другие ситуации, когда, к примеру, из-за исключений могут происходить утечки, когда дело до delete не доходить. Вообщем, один раз приучить себя использовать shared_ptr везде и не париться. Такое моё мнение.
« Последнее редактирование: Июнь 19, 2014, 10:35 от 8Observer8 » Записан
Bepec
Гость
« Ответ #32 : Июнь 19, 2014, 10:34 »

Гениально Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Июнь 19, 2014, 10:54 »

К примеру, чтобы не бояться забыть написать delete. Есть и другие ситуации, когда, к примеру, из-за исключений могут происходить утечки, когда дело до delete не доходить. Вообщем, один раз приучить себя использовать shared_ptr везде и не париться.
Нехорошо что коду придается смысл которого нет. Увидев объявление шаред читающий имеет ввиду типа "внимание, этот указатель может жить и без объекта" (где он член), и такая ситуация может быть непростой. А если все без разбора шаред - понять логику гораздо труднее.

Такое моё мнение.
Не надо тупенько передирать чужие приемы, мол, вот опытный программист везде юзает шаред - и я буду! Свое мнение надо еще иметь.
Записан
Bepec
Гость
« Ответ #34 : Июнь 19, 2014, 11:05 »

Самое весёлое потом начнётся. Когда надо будет держать пару десятков умных указателей.
Это выбешивает почище синего экрана каждые 5 минут Улыбающийся

PS не спорю, что это признак "хорошей" архитектуры, но и тут не лучше Веселый
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Июнь 19, 2014, 11:08 »

Самое весёлое потом начнётся. Когда надо будет держать пару десятков умных указателей.
Какие пару десятков? Их тысячи прямо сейчас держатся и кроме спокойствия (глядя на потребление памяти серверами) ничего не приносят. Улыбающийся
Записан
vizir.vs
Гость
« Ответ #36 : Июнь 19, 2014, 11:48 »

Igors, смысл в том, чтобы везде использовать shared_ptr вместо обычных указателей.
А в чем от этого смысл?
К примеру, чтобы не бояться забыть написать delete. Есть и другие ситуации, когда, к примеру, из-за исключений могут происходить утечки, когда дело до delete не доходить. Вообщем, один раз приучить себя использовать shared_ptr везде и не париться. Такое моё мнение.


Почему тогда shared_prt, а не scoped_ptr? scoped_ptr менее тяжеловесен и не ведет подсчет ссылок.  Поскольку твой объект ни куда не передается и не копируется, то достаточно и scoped_ptr. Igors правильно сказал, если тебе требуется, чтобы член-класса жил без объекта данного класса, тогда используй shared, а если ты не хочешь писать new/delete и следить за правильным созданием/удалением объектов, то тогда тебе хватит scoped_ptr (он же auto_ptr в С++11, он же unique_ptr в С++03)
« Последнее редактирование: Июнь 19, 2014, 11:56 от vizir.vs » Записан
vizir.vs
Гость
« Ответ #37 : Июнь 19, 2014, 12:00 »

Самое весёлое потом начнётся. Когда надо будет держать пару десятков умных указателей.
Это выбешивает почище синего экрана каждые 5 минут Улыбающийся

PS не спорю, что это признак "хорошей" архитектуры, но и тут не лучше Веселый

По мне, так RAII очень полезная идиома.
Записан
8Observer8
Гость
« Ответ #38 : Июнь 23, 2014, 09:57 »

Судя по тексту из этого списка: http://www.cplusplus.com/reference/memory/ "Automatic Pointer [deprecated]" => std::auto_ptr - "резко осуждается"

Вместо него советуют использовать std::unique_ptr из C++11: http://www.cplusplus.com/reference/memory/unique_ptr/
Цитировать
Note: This class template is deprecated as of C++11. unique_ptr is a new facility with a similar functionality, but with improved security (no fake copy assignments), added features (deleters) and support for arrays. See unique_ptr for additional information.

(он же auto_ptr в С++11, он же unique_ptr в С++03)
Кстати, здесь наоборот Улыбающийся

Как я понял, scoped_ptr - это из библиотеки Boost. А std::unique_ptr, для моего примера, будет наиболее подходящим:
Код
C++ (Qt)
#ifndef DOWNLOADER_H
#define DOWNLOADER_H
 
#include <memory>
#include <QObject>
#include <QString>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
 
class Downloader : public QObject
{
public:
 
   Downloader( )
   {
       m_manager = std::unique_ptr<QNetworkAccessManager>( new QNetworkAccessManager( this ) );
   }
 
   void fetch( const QString &url )
   {
       m_reply.reset( m_manager->get( QNetworkRequest( QUrl( url ) ) ) );
       connect( m_reply.get( ), SIGNAL( finished( ) ),
                this, SLOT( replyFinished( ) ) );
   }
 
signals:
   void signalWithContent( QString content );
 
private slots:
   void replyFinished( )
   {
       QByteArray data = m_reply->readAll( );
       QString content( data );
       emit signalWithContent( content );
   }
 
private:
   std::unique_ptr<QNetworkReply> m_reply;
   std::unique_ptr<QNetworkAccessManager> m_manager;
};
 
#endif // DOWNLOADER_H
 

P.S Единственное неудобство, то что не срабатывает подсказка с std::unique_ptr в Creator'е. К примеру, с std::shared_ptr работает вставка "finished( )" если я набрал "fini" и нажал "Ctrl+Space", а с std::unique_ptr - нет:
Код
C++ (Qt)
connect( m_reply.get( ), SIGNAL( fini ) );
 
« Последнее редактирование: Июль 02, 2014, 12:16 от 8Observer8 » Записан
vizir.vs
Гость
« Ответ #39 : Июнь 23, 2014, 13:29 »

у Qt так же есть свои умные указатели. А  по поводу auto_ptr и unique_ptr, я к бустовским умным указателям уже привык и stl-кие почти не использую.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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