<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[boost:asio mem leak]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>folgender code ist ein beispiel von alex ott, der code funktioniert soweit ganz gut jedoch gibt es ein memleak problem welches ich nicht nachvollziehen kann. leider reagiert der author nicht auf emails oder dergleichen.</p>
<p>bei jeder neuen connection wird, trotz destructen des connection objects, speicher nicht freigegeben. der leak kann ueber ein einfaches connection spamen per &quot;while true; do bash -c &quot;nc localhost 10001 &amp;&quot;; done&quot; reproduziert werden.</p>
<p>über eventuelle hinweise/lösungen wäre ich sehr dankbar,</p>
<p>grüße,<br />
sekhem</p>
<pre><code class="language-cpp">/**
 * <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4518">@file</a>   common.h
 * @author Alex Ott &lt;alexott@gmail.com&gt;
 * 
 * @brief  Declarations and includes, common for all boost::asio based programs
 * 
 * 
 */

#include &lt;boost/asio.hpp&gt;
#include &lt;boost/shared_ptr.hpp&gt;
#include &lt;boost/enable_shared_from_this.hpp&gt;

#include &lt;boost/algorithm/string.hpp&gt;
#include &lt;boost/lexical_cast.hpp&gt;

#include &lt;boost/regex.hpp&gt;

#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread/thread.hpp&gt;

#include &lt;iostream&gt;
#include &lt;string&gt;

namespace ba=boost::asio;
namespace bs=boost::system;

typedef boost::shared_ptr&lt;ba::ip::tcp::socket&gt; socket_ptr;
typedef boost::shared_ptr&lt;ba::io_service&gt; io_service_ptr;

#include &lt;deque&gt;

typedef std::deque&lt;io_service_ptr&gt; ios_deque;

/**
 * Connection class, implementing async input/output
 * 
 */
class connection : public boost::enable_shared_from_this&lt;connection&gt; {
public:
	typedef boost::shared_ptr&lt;connection&gt; pointer;

	/** 
	 * Create new connection 
	 * 
	 * @param io_service io_service in which this connection will work
	 * 
	 * @return pointer to newly allocated object
	 */
	static pointer create(ba::io_service&amp; io_service) {
		return pointer(new connection(io_service));
	}

	/** 
	 * Return socket, associated with this connection. This socket used in accept operation
	 * 
	 * 
	 * @return reference to socket
	 */
	ba::ip::tcp::socket&amp; socket() {
		return socket_;
	}

	/** 
	 * Start input/output chain with reading of headers from browser
	 * 
	 */
	void start() {
		// start reading of headers from browser
		boost::asio::async_read_until(socket_, buf, boost::regex(&quot;\r\n\r\n&quot;),
			boost::bind(&amp;connection::handle_read, shared_from_this(),
						ba::placeholders::error,
						ba::placeholders::bytes_transferred));
	}

private:
	/** 
	 * Initialize connection
	 * 
	 * @param io_service 
	 * 
	 * @return 
	 */
	connection(ba::io_service&amp; io_service) : socket_(io_service) {
	}

	/** 
	 * Called when data written to browser
	 * 
	 * @param error object, containing information about errors
	 * @param bytes_transferred number of transferred bytes
	 */
	void handle_write(const boost::system::error_code&amp; error,
					  size_t bytes_transferred) {
	}

	/** 
	 * Called when data readed from browser
	 * 
	 * @param error object, containing information about errors
	 * @param bytes_transferred number of transferred bytes
	 */
	void handle_read(const boost::system::error_code&amp; error,
					 size_t bytes_transferred) {
		ba::async_write(socket_, ba::buffer(message_),
						boost::bind(&amp;connection::handle_write, shared_from_this(),
									ba::placeholders::error,
									ba::placeholders::bytes_transferred));
	}

	ba::ip::tcp::socket socket_; /**&lt; socket, associated with browser */
	boost::asio::streambuf buf;  /**&lt; buffer for request data */
	static std::string message_; /**&lt; data, that we'll return to browser */
};

std::string connection::message_=&quot;HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n&quot;
	&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;test&lt;/title&gt;&quot;
	&quot;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;Test&lt;/h1&gt;&lt;p&gt;This is a test!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&quot;;

/**
 * Server class
 * 
 */
class server {
public:
/** 
 * Initialize all needed data
 * 
 * @param io_service reference to io_service
 * @param port port to listen on, by default - 10001
 */
	server(const ios_deque&amp; io_services, int port=10001)
		: io_services_(io_services),
		  acceptor_(*io_services.front(),
					ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port)) {
		start_accept();
	}

private:
	/** 
	 * start connection accepting in async mode
	 * 
	 */
	void start_accept() {
		// select next io_service object
		io_services_.push_back(io_services_.front());
		io_services_.pop_front();
		// create new connection
		connection::pointer new_connection = connection::create(*io_services_.front());
		// start acceptor in async mode
		acceptor_.async_accept(new_connection-&gt;socket(),
							   boost::bind(&amp;server::handle_accept, this, new_connection,
										   ba::placeholders::error));
	}

	/** 
	 * Run when new connection is accepted
	 * 
	 * @param new_connection accepted connection
	 * @param error reference to error object
	 */
	void handle_accept(connection::pointer new_connection,
					   const boost::system::error_code&amp; error) 	{
		if (!error) {
			new_connection-&gt;start();
			start_accept();
		}
	}

	ios_deque io_services_;		     /**&lt; deque of pointers to io_services */
	ba::ip::tcp::acceptor acceptor_; /**&lt; object, that accepts new connections */
};

/** 
 * Main routine
 * 
 * @param argc number of arguments
 * @param argv pointers to arguments
 * 
 * @return error code
 */
int main(int argc, char** argv) {
	try {
		int thread_num=10;
		// read number of threads with io_services from command line, if provided
		if(argc &gt; 1)
			thread_num=boost::lexical_cast&lt;int&gt;(argv[1]);
		ios_deque io_services;
		std::deque&lt;ba::io_service::work&gt; io_service_work;

		boost::thread_group thr_grp;
		// create threads for each io_service
		for (int i = 0; i &lt; thread_num; ++i) {
			io_service_ptr ios(new ba::io_service);
			io_services.push_back(ios);
			io_service_work.push_back(ba::io_service::work(*ios));
			// run io_service in their own thread
			thr_grp.create_thread(boost::bind(&amp;ba::io_service::run, ios));
		}
		// create server
		server server(io_services);
		// wait until all thread will finished
		thr_grp.join_all();
	} catch (std::exception&amp; e) {
		std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/258316/boost-asio-mem-leak</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 10:35:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258316.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jan 2010 08:30:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost:asio mem leak on Sat, 09 Jan 2010 08:30:31 GMT]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>folgender code ist ein beispiel von alex ott, der code funktioniert soweit ganz gut jedoch gibt es ein memleak problem welches ich nicht nachvollziehen kann. leider reagiert der author nicht auf emails oder dergleichen.</p>
<p>bei jeder neuen connection wird, trotz destructen des connection objects, speicher nicht freigegeben. der leak kann ueber ein einfaches connection spamen per &quot;while true; do bash -c &quot;nc localhost 10001 &amp;&quot;; done&quot; reproduziert werden.</p>
<p>über eventuelle hinweise/lösungen wäre ich sehr dankbar,</p>
<p>grüße,<br />
sekhem</p>
<pre><code class="language-cpp">/**
 * <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4518">@file</a>   common.h
 * @author Alex Ott &lt;alexott@gmail.com&gt;
 * 
 * @brief  Declarations and includes, common for all boost::asio based programs
 * 
 * 
 */

#include &lt;boost/asio.hpp&gt;
#include &lt;boost/shared_ptr.hpp&gt;
#include &lt;boost/enable_shared_from_this.hpp&gt;

#include &lt;boost/algorithm/string.hpp&gt;
#include &lt;boost/lexical_cast.hpp&gt;

#include &lt;boost/regex.hpp&gt;

#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread/thread.hpp&gt;

#include &lt;iostream&gt;
#include &lt;string&gt;

namespace ba=boost::asio;
namespace bs=boost::system;

typedef boost::shared_ptr&lt;ba::ip::tcp::socket&gt; socket_ptr;
typedef boost::shared_ptr&lt;ba::io_service&gt; io_service_ptr;

#include &lt;deque&gt;

typedef std::deque&lt;io_service_ptr&gt; ios_deque;

/**
 * Connection class, implementing async input/output
 * 
 */
class connection : public boost::enable_shared_from_this&lt;connection&gt; {
public:
	typedef boost::shared_ptr&lt;connection&gt; pointer;

	/** 
	 * Create new connection 
	 * 
	 * @param io_service io_service in which this connection will work
	 * 
	 * @return pointer to newly allocated object
	 */
	static pointer create(ba::io_service&amp; io_service) {
		return pointer(new connection(io_service));
	}

	/** 
	 * Return socket, associated with this connection. This socket used in accept operation
	 * 
	 * 
	 * @return reference to socket
	 */
	ba::ip::tcp::socket&amp; socket() {
		return socket_;
	}

	/** 
	 * Start input/output chain with reading of headers from browser
	 * 
	 */
	void start() {
		// start reading of headers from browser
		boost::asio::async_read_until(socket_, buf, boost::regex(&quot;\r\n\r\n&quot;),
			boost::bind(&amp;connection::handle_read, shared_from_this(),
						ba::placeholders::error,
						ba::placeholders::bytes_transferred));
	}

private:
	/** 
	 * Initialize connection
	 * 
	 * @param io_service 
	 * 
	 * @return 
	 */
	connection(ba::io_service&amp; io_service) : socket_(io_service) {
	}

	/** 
	 * Called when data written to browser
	 * 
	 * @param error object, containing information about errors
	 * @param bytes_transferred number of transferred bytes
	 */
	void handle_write(const boost::system::error_code&amp; error,
					  size_t bytes_transferred) {
	}

	/** 
	 * Called when data readed from browser
	 * 
	 * @param error object, containing information about errors
	 * @param bytes_transferred number of transferred bytes
	 */
	void handle_read(const boost::system::error_code&amp; error,
					 size_t bytes_transferred) {
		ba::async_write(socket_, ba::buffer(message_),
						boost::bind(&amp;connection::handle_write, shared_from_this(),
									ba::placeholders::error,
									ba::placeholders::bytes_transferred));
	}

	ba::ip::tcp::socket socket_; /**&lt; socket, associated with browser */
	boost::asio::streambuf buf;  /**&lt; buffer for request data */
	static std::string message_; /**&lt; data, that we'll return to browser */
};

std::string connection::message_=&quot;HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n&quot;
	&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;test&lt;/title&gt;&quot;
	&quot;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;Test&lt;/h1&gt;&lt;p&gt;This is a test!&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&quot;;

/**
 * Server class
 * 
 */
class server {
public:
/** 
 * Initialize all needed data
 * 
 * @param io_service reference to io_service
 * @param port port to listen on, by default - 10001
 */
	server(const ios_deque&amp; io_services, int port=10001)
		: io_services_(io_services),
		  acceptor_(*io_services.front(),
					ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port)) {
		start_accept();
	}

private:
	/** 
	 * start connection accepting in async mode
	 * 
	 */
	void start_accept() {
		// select next io_service object
		io_services_.push_back(io_services_.front());
		io_services_.pop_front();
		// create new connection
		connection::pointer new_connection = connection::create(*io_services_.front());
		// start acceptor in async mode
		acceptor_.async_accept(new_connection-&gt;socket(),
							   boost::bind(&amp;server::handle_accept, this, new_connection,
										   ba::placeholders::error));
	}

	/** 
	 * Run when new connection is accepted
	 * 
	 * @param new_connection accepted connection
	 * @param error reference to error object
	 */
	void handle_accept(connection::pointer new_connection,
					   const boost::system::error_code&amp; error) 	{
		if (!error) {
			new_connection-&gt;start();
			start_accept();
		}
	}

	ios_deque io_services_;		     /**&lt; deque of pointers to io_services */
	ba::ip::tcp::acceptor acceptor_; /**&lt; object, that accepts new connections */
};

/** 
 * Main routine
 * 
 * @param argc number of arguments
 * @param argv pointers to arguments
 * 
 * @return error code
 */
int main(int argc, char** argv) {
	try {
		int thread_num=10;
		// read number of threads with io_services from command line, if provided
		if(argc &gt; 1)
			thread_num=boost::lexical_cast&lt;int&gt;(argv[1]);
		ios_deque io_services;
		std::deque&lt;ba::io_service::work&gt; io_service_work;

		boost::thread_group thr_grp;
		// create threads for each io_service
		for (int i = 0; i &lt; thread_num; ++i) {
			io_service_ptr ios(new ba::io_service);
			io_services.push_back(ios);
			io_service_work.push_back(ba::io_service::work(*ios));
			// run io_service in their own thread
			thr_grp.create_thread(boost::bind(&amp;ba::io_service::run, ios));
		}
		// create server
		server server(io_services);
		// wait until all thread will finished
		thr_grp.join_all();
	} catch (std::exception&amp; e) {
		std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1835442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835442</guid><dc:creator><![CDATA[sekhem]]></dc:creator><pubDate>Sat, 09 Jan 2010 08:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to boost:asio mem leak on Sat, 09 Jan 2010 08:39:59 GMT]]></title><description><![CDATA[<p>Das passiert, wenn man lauter fremdes Zeug nimmt und es nicht versteht. Aber darum gibts ja so viele Foren, da findet man schon nen dummen der deine Arbeit macht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835443</guid><dc:creator><![CDATA[tja]]></dc:creator><pubDate>Sat, 09 Jan 2010 08:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to boost:asio mem leak on Sat, 09 Jan 2010 08:46:27 GMT]]></title><description><![CDATA[<p>tja schrieb:</p>
<blockquote>
<p>Das passiert, wenn man lauter fremdes Zeug nimmt und es nicht versteht. Aber darum gibts ja so viele Foren, da findet man schon nen dummen der deine Arbeit macht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>das ist genau der punkt warum du hier den original code findest und nicht irgendeinen eigenen copy pasted kram. bevor ich es nicht verstehe, kann ich es auch nicht benutzen.</p>
<p>trotzdem danke,<br />
sekhem</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835444</guid><dc:creator><![CDATA[sekhem]]></dc:creator><pubDate>Sat, 09 Jan 2010 08:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to boost:asio mem leak on Sat, 09 Jan 2010 09:05:00 GMT]]></title><description><![CDATA[<p>Schau dir lieber die examples von boost::asio selber an. Alleine den Deque&lt;shared_ptr&lt;io_service&gt; &gt; finde ich sehr komisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835448</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Sat, 09 Jan 2010 09:05:00 GMT</pubDate></item><item><title><![CDATA[Reply to boost:asio mem leak on Sat, 09 Jan 2010 10:34:54 GMT]]></title><description><![CDATA[<p>Schreibts lieber selber neu, da lernt man mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1835482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1835482</guid><dc:creator><![CDATA[tja]]></dc:creator><pubDate>Sat, 09 Jan 2010 10:34:54 GMT</pubDate></item></channel></rss>