c++ - boost::shared_ptr<TTransport> 是否在销毁后关闭连接?

标签 c++ thrift

我有一个使用 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();可以注释掉没有任何问题吧?

最佳答案

查看the source ,我没有看到 TTransport 在其析构函数中执行任何操作。但是,TSocket ( src ) 的析构函数确实调用了它的 close() 函数。

由于 shared_ptr 是在您的 main 函数的范围内创建的,并且没有其他人请求指向负责 shared_ptr 的对象的指针,因此“套接字”将在超出范围后析构。

TBufferedTransport似乎没有明确声明析构函数,但是,它确实拥有一个 TSocket,当 TBufferedTransport 析构时它将超出范围,因此 TSocket 的析构函数被调用。

TBufferedTransport::[rBuf_/wBuf_] 是 scoped_arrays 所以我认为你也不需要担心这些。

关于c++ - boost::shared_ptr<TTransport> 是否在销毁后关闭连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45364528/

相关文章:

c++ - 是否可以出于性能目的创建默认初始化的类 std::is_trivial

c++ - 在 C++ 中将指针变量作为指向不同类型的指针进行访问

cassandra - 如何获取 Cassandra 中添加的最后一行的行键

c# - 如何使用 Thrift 的 C# THttpHandler?

c++ - Apache thrift 未定义对 apache::thrift::server::TNonblockingServer 的引用

c++ - 从 QThread 与 QProcess 通信

c++ - 开关盒中的多个条件?

c++ - 在特定偏移量和类型处重新解释_cast 原始结构的安全方法?

php - 启动和停止hiveserver2

scala - 如何从不同的模块 "include"Thrift 文件?