2016-05-25 9 views
1

私はいくつかのクラスのインスタンスに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クラスが失われています。しかし、デバッガは私にヌードのようなものを表示していないので、私は何か分かりません。

答えて

1

In generalそれは保証されません。

移動代入演算子は、通常、引数で開催されたリソースを「盗む」(例えば、ポインタ動的に割り当てられたために、オブジェクト、ファイルディスクリプタ、TCPソケット、I/Oストリーム、ランニングをスレッドなど)のコピーを作成し、引数を有効であるがそれ以外の不確定な状態にしておきます。たとえば、std :: stringまたはstd :: vectorからのmove-assigningは、引数が空のままになることがあります。ただし、この動作は信頼されるべきではありません。

しかし、それは同じ状態のままにtcp::socketのドキュメントによれば:basic_stream_socketを用いて構成する場合のように移動後

、移動-からオブジェクトが同じ状態である(io_service & )コンストラクタです。

+0

答えてくれてありがとう、私は同じように思っていましたが...あなたが言及したように "盗まれた"リソースのために私は混乱しました。私はそれを試し、それがOKになった後あなたの答えを受け入れる:) –

+0

本当に良いニュースではないため、期待どおりに動作していません。私は何か間違っていることがありますか?私はいくつかの問題の説明で投稿を更新しました。 @ teivaz - それを確認してください。 –

+0

私は本当に今ここで何が間違っているのかは分かりません。私が見ているのは、 'new_connection_.reset(新しい接続(std :: move(socket_)、io_service _));'ここで 'std :: move'をラップする必要はありません。 (ソケット&&、io_service&); '。私は明日それに戻ろうとします。 – teivaz

関連する問題