C++ Boost::Thread & Boost::ASIO Memory leak
C++ Boost::Thread & Boost::ASIO memory leak
我的代码有一个问题。
当连接结束时,有10兆内存泄漏每个连接。
连接正常,发送的数据包有效。
我不知道哪里不对。
Worker函数:
void worker(boost::shared_ptr<CConnection> connection)
{
boost::asio::ip::tcp::socket &socket = *(connection->socket);
boost::asio::socket_base::non_blocking_io make_non_blocking(true);
socket.io_control(make_non_blocking);
while ( connection->close == false ) {
char * buffer = new char[16]();
buffer[0] = 16;
buffer[4] = 1;
buffer[8] = 1;
buffer[12] = 1;
boost::asio::async_write(socket, boost::asio::buffer(buffer, 16), boost::bind(handle_write, buffer));
connection->close = true;
} // while connection not to be closed
LOG(INFO, "Connection finished!");
socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
socket.close();
}
接收代码:
void CCore::handle_accept(const boost::system::error_code& error)
{
if (error) {
// accept failed
LOG(ERROR, "Acceptor failed: " << error.message());
return;
}
LOG(INFO, "Accepted connection from " << this->connection->endpoint.address().to_string() << ":" << this->connection->endpoint.port());
this->connection->thread = boost::shared_ptr<boost::thread>(new boost::thread(worker, this->connection));
this->connection = boost::shared_ptr<CConnection>(new CConnection());
this->connection->master_io_service = this->io_service;
this->acceptor->async_accept(*(this->connection->socket), this->connection->endpoint, boost::bind(&CCore::handle_accept, this, boost::asio::placeholders::error));
}
连接定义:
class CConnection {
public:
CConnection(void);
boost::asio::io_service io_service;
boost::shared_ptr<boost::asio::ip::tcp::socket> socket;
boost::asio::ip::tcp::endpoint endpoint;
boost::shared_ptr<boost::thread> thread;
boost::asio::io_service *master_io_service;
bool close;
};
在handle_write中释放包数据:
void handle_write(char * buf)
{
delete [] buf;
}
根据此页面boost::asio::buffer不拥有它指向的内存,因此您的缓冲区new[]
向上泄漏,因为没有匹配的delete[]
。
再一次,根据该页是你的责任,以确保它仍然活着,然后delete[]
之后。
在工作线程中,你在每个循环中分配内存,但你永远不会释放它。
你既可以使用智能指针,也可以将指针作为参数传递给异步写入处理程序函数,并在那里释放它。
写缓冲区的内存管理看起来很好。CConnection
和CConnection::thread
之间有一个循环引用:
-
CConnection::thread
的寿命取决于CConnection
,因为它是一个成员变量。 -
CConnection
的寿命间接取决于CConnection::thread
,因为CConnection
被绑定为boost::thread
的构造函数的参数。此参数的生命周期与boost::thread
对象的生命周期耦合,而不是与底层线程的执行耦合。void CCore::handle_accept(...) { ... this->connection->thread = boost::shared_ptr<boost::thread>(new boost::thread(worker, this->connection)); ... }
删除循环引用应该允许适当的清理。我不清楚这些对象的预期寿命是多少,所以我不能提供一个确切的解决方案。
还有一些Boost。在我看来,Asio的操作有点笨拙。它看起来好像混合了同步和异步行为,这可能很难实现。在这种情况下,async_write
操作有可能在完成之前被取消。考虑在worker
和handle_write
之间同步状态,并在handle_write
内部设置关闭状态。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 需要帮助理解 Boost.Atomic Memory Model 'memory_order_release' 示例
- C++ Boost::Thread & Boost::ASIO Memory leak
- boost::interprocess::managed_shared_memory: Grow(): Memory R