#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>

class session {
public:
	session(boost::asio::io_service& io_service) :
			io_service_(io_service), socket_(io_service), deleted_(false), timeout_(
					new boost::asio::deadline_timer(io_service_)) {
		std::cout << "Session constructed" << std::endl;
	}
	~session() {
		delete timeout_;
		std::cout << "Session destructed" << std::endl;
	}

	boost::asio::ip::tcp::socket& socket() {
		return socket_;
	}
	void del() {
		if (!deleted_) {
			deleted_ = true;
			delete this;
		}
	}
	void start(session* new_session) {
		socket_.async_read_some(
				boost::asio::buffer(data_, max_length - 1),
				boost::bind(&session::handle_read, this,
						boost::asio::placeholders::error,
						boost::asio::placeholders::bytes_transferred));
		timeout_->expires_from_now(boost::posix_time::milliseconds(10000));
		timeout_->async_wait(
				boost::bind(&session::wait_callback, this,
						boost::asio::placeholders::error));

	}
	void wait_callback(const boost::system::error_code& error) {
		if (!error) {
			this->socket().shutdown(
					boost::asio::ip::tcp::socket::shutdown_both);
			this->socket().close();
			this->del();
		}

	}
	void handle_read(const boost::system::error_code& error,
			size_t bytes_transferred) {
		if (!error) {
			timeout_->cancel();
			data_[bytes_transferred] = '\0';
			if (NULL != strstr(data_, "quit")) {
				this->socket().shutdown(
						boost::asio::ip::tcp::socket::shutdown_both);
				this->socket().close();
				io_service_.stop();
			} else {
				boost::asio::async_write(
						socket_,
						boost::asio::buffer(data_, bytes_transferred),
						boost::bind(&session::handle_write, this,
								boost::asio::placeholders::error));

				socket_.async_read_some(
						boost::asio::buffer(data_, max_length - 1),
						boost::bind(&session::handle_read, this,
								boost::asio::placeholders::error,
								boost::asio::placeholders::bytes_transferred));
				timeout_->expires_from_now(
						boost::posix_time::milliseconds(10000));
				timeout_->async_wait(
						boost::bind(&session::wait_callback, this,
								boost::asio::placeholders::error));
			}
		} else {
			this->del();
		}
	}

	void handle_write(const boost::system::error_code& error) {
		if (!error) {
			//
		} else {
			this->del();
		}
	}

private:
	boost::asio::io_service& io_service_;
	boost::asio::ip::tcp::socket socket_;
	enum {
		max_length = 1024
	};
	char data_[max_length];
	boost::asio::deadline_timer* timeout_;
	bool deleted_;
};

class server {
public:
	server(boost::asio::io_service& io_service, short port) :
			io_service_(io_service), acceptor_(
					io_service,
					boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),
							port)) {
		new_session_ = new session(io_service_);
		acceptor_.async_accept(
				new_session_->socket(),
				boost::bind(&server::handle_accept, this,
						boost::asio::placeholders::error));
		std::cout << "Server constructed" << std::endl;
	}
	~server() {
		delete new_session_;
		std::cout << "Server destructed" << std::endl;
	}
	void handle_accept(const boost::system::error_code& error) {
		if (!error) {
			new_session_->start(new_session_);
			new_session_ = new session(io_service_);
			acceptor_.async_accept(
					new_session_->socket(),
					boost::bind(&server::handle_accept, this,
							boost::asio::placeholders::error));
		} else {
		}
	}

private:
	boost::asio::io_service& io_service_;
	boost::asio::ip::tcp::acceptor acceptor_;
	session* new_session_;
};

int main(int argc, char* argv[]) {
	try {
		boost::asio::io_service io_service;
		server s(io_service, 9999);
		io_service.run();
	} catch (std::exception& e) {
		std::cerr << "Exception: " << e.what() << "\n";
	}
	return 0;
}

Dr memory:

 ERRORS FOUND:
    203 unique,  1254 total unaddressable access(es)
     35 unique,   629 total uninitialized access(es)
      0 unique,     0 total invalid heap argument(s)
      0 unique,     0 total warning(s)
     17 unique,    39 total,   2198 byte(s) of leak(s)
      4 unique,    46 total,   2800 byte(s) of possible leak(s)
ERRORS IGNORED:
      0 user-suppressed,     0 default-suppressed error(s)
      0 user-suppressed,     2 default-suppressed leak(s)
     56 ignored assumed-innocuous system leak(s)
    152 still-reachable allocation(s)
      0 error(s) beyond -report_max
      0 leak(s) beyond -report_leak_max

skąd te wszystkie błędy - siedzę nad tym drugi dzień i nie mam już pomysłów?