рдХреНрдпреВрдЯреА рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛

рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдВрддреНрд░ рд╣реИрдВред Qt рдХреЗ рдкрд╛рд╕ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рд╣реИ, рдЬрдм рд╡рд╕реНрддреБрдУрдВ рдХреЛ QObject рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдПрдХ "рд╕рдВрдмрдВрдз" рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдорд╛рддрд╛-рдкрд┐рддрд╛ / рдмрдЪреНрдЪреЗред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп, рдпрд╣ рдЙрд╕рдХреЗ рд╕рднреА рдмрдЪреНрдЪреЗ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рд╡рд╕реНрддреБрдУрдВ "рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ" рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреА рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдбрд┐рдмрдЧ рдмрдЧ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд▓реЗрдЦ рд╕реНрдорд╛рд░реНрдЯ-рдкреЙрдЗрдВрдЯрд░ QScopedPointer рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛, рдЬреЛ рдХрд┐ QSaredPointer рдХрд╛ "рд▓рд╛рдЗрдЯ" рд╕рдВрд╕реНрдХрд░рдг рд╣реИред QScopedPointer 4.6 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдореЗрдВ, рдХреНрдпреВрдЯреА-рд╕реНрдорд╛рд░реНрдЯ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ:
QSaredPointer - рдмрдврд╝рд╛рд╡рд╛ :: рд╕рд╛рдЭрд╛_рдкреНрд░рддрд┐
QWeakPointer - рдмрдврд╝рд╛рд╡рд╛ :: рдХрдордЬреЛрд░_рдкреНрд░рддрд┐
QScopedPointer - рдмрдврд╝рд╛рд╡рд╛ :: scoped_ptr

рдЙрджрд╛рд╣рд░рдг 1

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ m_socket рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рд▓реАрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реЙрдХреЗрдЯ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ:

class test_socket : public QTcpSocket { public: test_socket( QObject * parent ) : QTcpSocket( parent ) { } virtual ~test_socket( ) { qDebug( ) << "~test_socket"; } }; class test_scop_ptr_obj : public QObject { Q_OBJECT test_socket * m_socket; public: test_scop_ptr_obj( ) : m_socket( new test_socket( 0 ) ) { m_socket->connectToHost( "www.ru", 80 ); connect( m_socket, SIGNAL( stateChanged ( QAbstractSocket::SocketState ) ), SLOT( on_state_changed( QAbstractSocket::SocketState ) ) ); } virtual ~test_scop_ptr_obj( ) { qDebug( ) << "~test_scop_ptr_obj"; } private Q_SLOTS: void on_state_changed( QAbstractSocket::SocketState socket_state ) { qDebug( ) << socket_state; } }; int main( int argc, char** argv ) { QCoreApplication a( argc, argv ); test_scop_ptr_obj obj; QTimer::singleShot( 3000, &a, SLOT( quit( ) ) ); return a.exec( ); } 

рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ:
QAbstractSocket :: ConnectingState
QAbstractSocket :: рдХрдиреЗрдХреНрдЯреЗрдбрд╕реНрдЯреЗрдЯ
~ test_scop_ptr_obj

рдЙрджрд╛рд╣рд░рдг 2

рдЕрдм рд▓рд╛рдЗрди рдмрджрд▓реЗрдВ:

  : m_socket( new test_socket( 0 ) ) 


рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:

  : m_socket( new test_socket( this ) ) 


рдФрд░ рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:

QAbstractSocket :: ConnectingState
QAbstractSocket :: рдХрдиреЗрдХреНрдЯреЗрдбрд╕реНрдЯреЗрдЯ
~ test_scop_ptr_obj
~ test_socket

рдЙрджрд╛рд╣рд░рдг 3

рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЕрдм рдХреНрд▓рд╛рд╕ test_scop_ptr_obj рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 class test_scop_ptr_obj : public QObject { Q_OBJECT QScopedPointer< test_socket > m_socket; public: test_scop_ptr_obj( ) : m_socket( new test_socket( 0 ) ) { m_socket->connectToHost( "www.ru", 80 ); connect( m_socket.data( ), SIGNAL( stateChanged ( QAbstractSocket::SocketState ) ), SLOT( on_state_changed( QAbstractSocket::SocketState ) ) ); } virtual ~test_scop_ptr_obj( ) { qDebug( ) << "~test_scop_ptr_obj"; } private Q_SLOTS: void on_state_changed( QAbstractSocket::SocketState socket_state ) { qDebug( ) << socket_state; } }; 


рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:
QAbstractSocket :: ConnectingState
QAbstractSocket :: рдХрдиреЗрдХреНрдЯреЗрдбрд╕реНрдЯреЗрдЯ
~ test_scop_ptr_obj
~ test_socket
QAbbridSocket :: UnconnectedState

рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдЙрджрд╛рд╣рд░рдг 1 рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛрддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг 2 рдФрд░ 3 рдкрд╣рд▓реЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВред рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, test_socket рд╡рд░реНрдЧ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 3 рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, on_state_changed рдлрд╝рдВрдХреНрд╢рди рдХреЛ ~ test_scop_ptr_obj рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред рдЕрдкрдиреЗ рдмрдЪреНрдЪреЗ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкреИрд░реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдиреЗ рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг 2 рдореЗрдВ, рд╕реНрдЯреЗрдЯрдЪреЗрдВрд╕реНрдб рд╕рд┐рдЧреНрдирд▓ test_scop_ptr_obj рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо

рдЙрджрд╛рд╣рд░рдг 3 рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╡рд┐рдпреЛрдЧ рдХреЛ test_scop_ptr_obj рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

  virtual ~test_scop_ptr_obj( ) { m_socket->disconnect( ); qDebug( ) << "~test_scop_ptr_obj"; } 


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдЙрдЯрдкреБрдЯ рдЙрджрд╛рд╣рд░рдг 2 рдореЗрдВ рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ред

Source: https://habr.com/ru/post/In128740/


All Articles