になるために、私はboost::asio::strand
wrap
機能を使用しようとしたとき、NULLになることをshared_from_this
から来たshared_ptr
を引き起こすように見えるので、それが二度目に実行された場合、プログラムがクラッシュする原因になります。ブースト:: ASIO ::ストランドshared_from_thisからのshared_ptrを引き起こしラップがNULL
ただし、これはバインドされた関数が引数なしの場合です。
ウォッチポイントを設定して呼び出しスタックをチェックした後、この動作はasync_result_init
からBOOST_ASIO_MOVE_CAST
に由来するshared_ptr
スワッピング値の移動コンストラクタによって発生しているようです。
私の質問は、この問題を避けるためにwrap
を正しく使用するにはどうすればよいですか?
class object : public boost::enable_shared_from_this<object> {
public:
object()
: service(new boost::asio::io_service),
work(new boost::asio::io_service::work(*service)),
strand(*service),
value(0) {}
void workerThread() {
service->run();
}
void run() {
func_int = strand.wrap(boost::bind(&object::handler_int, shared_from_this(), _1));
func_void = strand.wrap(boost::bind(&object::handler_void, shared_from_this()));
std::thread thread(boost::bind(&object::workerThread, this));
func_int(1);
func_int(1);
func_void();
func_void(); // Will crash due to shared_ptr being NULL, hence "value" cannot be accessed in handler_void
thread.join();
}
void handler_int(int parameter) {
cout << "handler_int: " << value << endl;
}
void handler_void() {
cout << "handler_void: " << value << endl;
}
boost::shared_ptr<boost::asio::io_service> service;
boost::shared_ptr<boost::asio::io_service::work> work;
boost::asio::strand strand;
std::function<void(int)> func_int;
std::function<void(void)> func_void;
int value;
};
int main(int argc, char *argv[]) {
boost::shared_ptr<object> obj(new object());
obj->run();
return 0;
}
作業オブジェクトを正しく初期化していません。 –
@RichardHodges:返信いただきありがとうございますが、それが原因であるかどうかはわかりません。私はこのように初期化された「仕事」も見てきました:[リンク](http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/services/logger_service.hpp) – Bill
が理解されています。それは貧弱なスタイルですが、本当の答えは以下のとおりです。 –