2017-07-28 4 views
0

ネットワーク通信にThriftを使用する小さなコードスニペットがあります。boost :: shared_ptr <TTransport>接続が一旦破壊されましたか?

int main() { 
    while (true) { 
    boost::shared_ptr<TTransport> socket(new TSocket("localhost", 9090)); 
    boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket)); 
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); 

    CalculatorClient client(protocol); 

    try { 
     transport->open(); 

     client.ping(); 
     cout << "ping()" << endl; 

     // following line is commented out intentionally 
     //transport->close(); 
    } catch (TException& tx) { 
     cout << "ERROR: " << tx.what() << endl; 
    } 
    } 
} 

私の質問です:boost :: shared_ptr close connectionは一度破壊されますか?はいの場合、transport->close();は何の問題もなくコメントアウトすることができます。

答えて

1

the sourceを見ると、TTransportはデストラクタで何もしていません。しかし、TSocketのデストラクタ(src)はclose()関数を呼び出しています。

shared_ptrはmain関数のスコープ内に作成されたもので、shared_ptrの世話をするオブジェクトへのポインタを他に誰も要求していないので、 'socket'はスコープから外れた後に破壊します。

TBufferedTransportはデストラクタを明示的に宣言しているようには見えませんが、TBufferedTransportが破棄されるとスコープから外れてTSocketのデストラクタが呼び出されます。

TBufferedTransport :: [rBuf_/wBuf_]はscoped_arraysなので、私はそれらについても心配する必要はないと思っています。

+1

ええ、私はちょうどソースコードを見て、同じものを見つけました。ありがとう! –

関連する問題