看看這段代碼:爲什麼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稱爲:操作中止
當我刪除主方法中的aa對象時,aa的析構函數上的asio :: ip :: tcp :: acceptor對象調用他的close,異步操作將調用asio :: error :: operation_aborted。
現在,經過刪除,呼叫像acceptHandler的方法AA刪除對象上不會引起崩潰或不好用的內存,但預計。當然,我使用valgrind內存分析器測試程序可能出現的錯誤,但不存在錯誤。
問題:爲什麼程序在通過boost調用已刪除對象的函數時正確地工作?
也許沒有一個具體的提升,但是我們是否已經有很多「我仍然可以使用已刪除的對象」的問題? – crashmstr
很明顯,您對我的問題的選擇是'不'。 – softghost