2017-07-28 77 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關閉連接一旦被破壞?如果是,那麼transport->close();可以被註釋掉沒有任何問題,對吧?

回答

1

看着the source,我沒有看到TTransport在其析構函數中做任何事情。但是,TSocket的析構函數(src)確實稱它爲close()函數。

由於shared_ptr是在主函數的作用域中創建的,並且沒有其他人向shared_ptr提供指向該對象的指針,所以'socket'在超出作用域後將會被破壞。

TBufferedTransport似乎沒有明確聲明一個析構函數,但是它擁有一個TSocket,當TBufferedTransport析構時它將超出範圍,從而調用TSocket的析構函數。

TBufferedTransport :: [rBuf_/wBuf_]是scoped_arrays,所以我不認爲你需要擔心這些。

+1

是的,我剛纔看了一下源代碼並找到了相同的東西。謝謝! –