【问题标题】:Memory leak when I using io_service::run我使用 io_service::run 时的内存泄漏
【发布时间】:2016-08-30 06:56:24
【问题描述】:

我正在尝试编写我的套接字类(下面的代码)。 最后一切正常:重新连接、连接、消息发送、消息接收

但是当我重复 TCPSocketBody::Connect(const std::string &adress, const std::string &port) 时,我注意到内存泄漏,例如主机无​​法访问。我的应用程序的大小正在增长。

我发现当我删除线时:

thread_io_service = boost::thread(boost::bind(&boost::asio::io_service::run, &io_service_global));

问题消失了。但我需要这条线。我做错了什么? 我在我的应用程序中检查了命令行的线程号,它始终是 1 或 2。

#include "TCPSocketBody.h"

TCPSocketBody::TCPSocketBody() : socket_(io_service_global),
                                 resolver(io_service_global),
                                 connected(false),
                                 expectedMessage(0)
{

}

void TCPSocketBody::Close()
{
  io_service_global.post(boost::bind(&TCPSocketBody::DoClose, this));
}

void TCPSocketBody::Connect(const std::string &adress, const std::string &port)
{
    io_service_global.reset();
    iterator = resolver.resolve({adress, port});

     boost::asio::async_connect(socket_, iterator,
           boost::bind(&TCPSocketBody::HandleConnect, this,
           boost::asio::placeholders::error));


     socket_.set_option(boost::asio::ip::tcp::no_delay(true));

     thread_io_service = boost::thread(boost::bind(&boost::asio::io_service::run, &io_service_global));

}

void TCPSocketBody::HandleConnect(const boost::system::error_code& error)
{
  if (!error)
  {           
      connected = true;

      boost::asio::async_read(socket_,
         boost::asio::buffer(data_to_read, MessageCoder::BufferSize()), boost::asio::transfer_all(),
         boost::bind(&TCPSocketBody::HandleReadHeader, this,
           boost::asio::placeholders::error));

  } else
  {
        Close();
  }
}

void TCPSocketBody::HandleReadHeader(const boost::system::error_code& error)
{
    expectedMessage = MessageCoder::HeaderToVal(data_to_read);

    if (expectedMessage > MessageCoder::MaxMessageSize())
    {
       expectedMessage = 0;
       Close();
    } else
    {
        boost::asio::async_read(socket_,
           boost::asio::buffer(data_to_read, expectedMessage), boost::asio::transfer_all(),
           boost::bind(&TCPSocketBody::HandleReadMessage, this,
             boost::asio::placeholders::error));
    }
}

void TCPSocketBody::HandleReadMessage(const boost::system::error_code& error)
{
    expectedMessage = 0;        

    boost::asio::async_read(socket_,
       boost::asio::buffer(data_to_read, MessageCoder::BufferSize()), boost::asio::transfer_all(),
       boost::bind(&TCPSocketBody::HandleReadHeader, this,
         boost::asio::placeholders::error));
}

void TCPSocketBody::WriteMessage(char *dataToSend)
{
    io_service_global.post(boost::bind(&TCPSocketBody::Write, this, dataToSend));
}

void TCPSocketBody::Write(char *dataToSend)
{
    data = dataToSend;

    boost::asio::async_write(socket_,
        boost::asio::buffer(data, std::strlen(data)),
        boost::bind(&TCPSocketBody::HandleWrite, this,
          boost::asio::placeholders::error));

}

void TCPSocketBody::HandleWrite(const boost::system::error_code& error)
{
  if (!error)
  {

  }
  else
  {
        Close();
  }
}

void TCPSocketBody::DoClose()
{
  socket_.close();
  connected = false;
}

【问题讨论】:

    标签: c++ boost memory-leaks boost-asio


    【解决方案1】:

    没有头文件,很难确定。我怀疑 thread_io_service 是一个成员变量。对“连接”的第二次调用将覆盖现有值而不破坏对象。在对象中分配的任何内存都将被泄漏。

    也许尝试在连接调用上为每个新线程创建一个 std::vector 的 thread_io_service 和 push_back。向量在被破坏时将破坏包含的对象。

    Valgrind 可能会更详细地查明问题所在。

    【讨论】:

    • 欢迎您。如果我的回答有帮助,请“接受”。我正在努力建立自己的声誉,感谢您的帮助。
    猜你喜欢
    • 2021-07-06
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多