私はいくつかのクラスのインスタンスにstd::move(my_asio_socket)
したいです。他のクラスのインスタンスに対して同じ操作を行うとどうなりますか?2つの異なるクラスインスタンスでboost asioソケット参照を使用できますか?
私の目的は、(のクラスB
をしましょう)(のクラスA
を言わせて)、および他にwrite_async
を実行するための1つのクラスのインスタンスでread_async
にあります。いくつかの機能の実装のために、私はこのようにしなければなりません。
どのような提案もいいでしょう。
を更新し
、私が期待通り正常に動作していません。デバッグ中
VS2015(vc14コンパイラは)私の例外の種類を示しています
Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > at memory location 0x02D8E3BC.
を、私はVSでcontinue
を襲った後、それは私のことを示している:私が言ったように
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
を私はboost::move
(またはstd::move
)ソケットを他のクラスインスタンスにしようとしています。
boost::shared_ptr<connection> new_connection_;//it's a field in my class,
//that's why i should reset it later
new_connection_.reset(new connection(std::move(socket_), io_service_));
new_connection_->start();
を今ここに私connection
CTORされています:ここで私がやっているのコードの抜粋であるあなたが見ることができるように、私はコメント行で初期化
connection::connection(boost::asio::ip::tcp::socket sock, boost::asio::io_service& io_ptr)
: socket_(boost::move(sock)),
io_ptr_(io_ptr),
remote_ep(socket_.remote_endpoint()),
//request_handler_(new request_handler(boost::move(socket_))),
work(new boost::asio::io_service::work(io_ptr))
{
boost::shared_ptr<request_handler> req_ptr(new request_handler(boost::move(socket_)));
request_handler_.swap(req_ptr);
}
試してみたが、しかし、それは私に同じ結果を示しています。ここ
はrequest_handler
ためCTORです:
request_handler::request_handler(boost::asio::ip::tcp::socket sock):
socket_(boost::move(sock)){ }
そしてここでは、問題が検出さ私の方法connection::start
です:
void connection::start()
{
boost::asio::ip::tcp::socket::keep_alive kl(true);
boost::asio::ip::tcp::socket::enable_connection_aborted eca(true);
// here it breaks, when trying to set an option
socket_.set_option(eca);
socket_.set_option(kl);
socket_.async_read_some(boost::asio::buffer(buffer_),
boost::bind(&connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
私はrequest_handler
の新しいインスタンスにsocket
を移動するために使用する場合にのみ、この問題が表示されます。私がいなければ、すべてがおかしくなる。どのような理由があるのか分かりませんが、socket_
(&
または*
なしのどこでも宣言しています)フィールドはconnection
クラスが失われています。しかし、デバッガは私にヌードのようなものを表示していないので、私は何か分かりません。
答えてくれてありがとう、私は同じように思っていましたが...あなたが言及したように "盗まれた"リソースのために私は混乱しました。私はそれを試し、それがOKになった後あなたの答えを受け入れる:) –
本当に良いニュースではないため、期待どおりに動作していません。私は何か間違っていることがありますか?私はいくつかの問題の説明で投稿を更新しました。 @ teivaz - それを確認してください。 –
私は本当に今ここで何が間違っているのかは分かりません。私が見ているのは、 'new_connection_.reset(新しい接続(std :: move(socket_)、io_service _));'ここで 'std :: move'をラップする必要はありません。 (ソケット&&、io_service&); '。私は明日それに戻ろうとします。 – teivaz