我有一个小代码段,使用Thrift进行网络通信。
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();
可以毫无问题地被注释掉,对吗?
答案 0 :(得分:1)
看着the source,我没有看到TTransport在其析构函数中做任何事情。但是,TSocket(src)的析构函数确实称它为close()函数。
由于shared_ptr是在main函数的范围内创建的,并且没有其他人请求指向对象的指针来处理shared_ptr,&#39; socket&#39;在它超出范围后会破坏。
TBufferedTransport似乎没有明确地声明析构函数,但是,它确实拥有一个TSocket,当TBufferedTransport析构时它将超出范围,从而调用TSocket的析构函数。
TBufferedTransport :: [rBuf_ / wBuf_]是scoped_arrays所以我不认为你需要担心这些。