Здравствуйте, не пойму откуда взялась ошибка...
выдается исключение bad_weak_ptr после вызова метода...
socketTCP->async_read_some(boost::asio::buffer(recvBuffer),
boost::bind(&Client::handle_read, this->shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//handle_read, handle_write - статическая функция класса Client..
если знаете в чём проблема просьба пояснить почему возникает исключение на моём примере....
#include "ServerTCP.h"
ServerTCP::ServerTCP(boost::asio::io_service &_io_service, int port)
:acceptor(_io_service, tcp::endpoint(tcp::v4(), port)), io_service(_io_service)
{
acceptor.listen();
wait_next_client();
}
ServerTCP::~ServerTCP(void)
{
}
//пришёл запрос на подключение
void ServerTCP::accept_handler(tcp::socket *socket, const boost::system::error_code &error)
{
if (!error)
{
std::cout << "accept" << std::endl;
new Client(socket);
}else
{
delete socket;
}
wait_next_client(); //Запускаем ожидание клиента заново
}
//cоздаём не запушенный сеанс и включаем слушатель
void ServerTCP::wait_next_client()
{
tcp::socket *socket = new tcp::socket(io_service);
//начинаем ждать новое подключение
acceptor.async_accept(*socket, boost::bind(&ServerTCP::accept_handler,
this, socket, boost::asio::placeholders::error));
}
#include "Client.h"
Client::Client(tcp::socket *_socketTCP)
{
socketTCP = _socketTCP;
//информируем
std::cout << "connect" << std::endl;
//включаем приём сообшений от клиента
socketTCP->async_read_some(boost::asio::buffer(recvBuffer),
boost::bind(&Client::handle_read, this->shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//информируем
std::cout << "connectX" << std::endl;
}
Client::~Client(void)
{
//информируем
std::cout << "disconnect" << std::endl;
//удаляем сокет
delete socketTCP;
}
//Пришли данные
void Client::handle_read( boost::shared_ptr<Client> ptr,
const boost::system::error_code& error,
size_t bytes_transferred)
{
if (error == boost::asio::error::operation_aborted) return;
if (!error)
{
//вывод на консоль инфы
std::cout << "<read data> size: " << bytes_transferred << std::endl;
//перезапуск
/*socketTCP->async_read_some(boost::asio::buffer(recvBuffer),
boost::bind(&Client::handle_read, ptr,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred))*/;
}
else
{
ptr->close();
}
}
void Client::close()
{
socketTCP->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
//socket.close();
}
консоль:
accept
connect
Exception: tr1::bad_weak_ptr
Для продолжения нажмите любую клавишу . . .