ルック:なぜboost :: bindが削除されたオブジェクトで動作していますか?このコードでは
#include <asio.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <iostream>
using namespace std;
class acceptor
{
private:
asio::ip::tcp::acceptor * a;
asio::io_service &_service;
asio::ip::tcp::endpoint ep;
public:
acceptor(asio::io_service &service, unsigned int port)
:_service(service), ep(asio::ip::tcp::v4(), port)
{
try {
a = new asio::ip::tcp::acceptor(service, ep);
}
catch (asio::system_error &e) {
cout << e.what() << endl;
}
continueAccept();
}
~acceptor() {
delete a;
cout << " destroy " << endl;
}
void continueAccept() {
cout << "start accepting ..." << endl;
boost::shared_ptr<asio::ip::tcp::socket> ptr(new asio::ip::tcp::socket(_service));
a->async_accept(*ptr, boost::bind(&acceptor::handleAccept, this, ptr, asio::placeholders::error));
}
void handleAccept(
boost::shared_ptr<asio::ip::tcp::socket> &socket,
const asio::error_code &e)
{
if (e == asio::error::operation_aborted) {
cout << "handler is called by error_code : " << e.message() << endl;
}
}
void close() {
cout << "close is called ..." << endl;
a->close();
}
};
int main(int argc, char *argv[]) {
asio::io_service service;
acceptor *aa = new acceptor(service, 8899);
service.poll();
service.reset();
delete aa;
service.poll();
service.reset();
return 0;
}
出力は次のとおりです。accpting
- 開始...
- Destoryは
- ハンドラはERROR_CODEによって呼び出されます。操作は
を中止mainメソッドでaaオブジェクトを削除すると、aa :: dest :: aaのデストラクタのasio :: ip :: tcp :: acceptorオブジェクトは彼のクローズを呼び出し、非同期操作はasio :: error :: operation_abortedを使って呼び出します。
さて、削除した後、クラッシュか悪いの使用メモリを起こすことはできませんが、期待されているAA削除されたオブジェクトにacceptHandlerのようなメソッドを呼び出します。もちろん、valgrindメモリアナライザでプログラムをテストしてエラーが発生する可能性はありますが、エラーはありません。
質問:削除されたオブジェクトの機能をブーストで呼び出す際に、プログラムが正しく機能するのはなぜですか?
ブーストに固有のものではないかもしれませんが、まだ「削除済みオブジェクトを使用できますか」という質問はたくさんありますか? – crashmstr
私の質問に対するあなたの選択は「いいえ」であることは明らかです。 – softghost