2013-08-02 2 views
4

이것은 예제를 기반으로 한 내 Boost.Asio 프로젝트의 SSCCE입니다. 그것은 아래로 이것에 버그를 추적하기 위해 한 시간 정도 걸렸다 :Boost.Asio segfault, 이유가 없습니다.

#include <boost/bind.hpp> 
#include <boost/asio.hpp> 
#include <boost/shared_ptr.hpp> 

class Connection { 
public: 
    Connection(boost::asio::io_service& io_service) : socket(io_service) {} 

private: 
    boost::asio::ip::tcp::socket socket; 
}; 

class Server { 
public: 
    Server() : signal_monitor(io_service) { 
     signal_monitor.add(SIGINT); 
     signal_monitor.add(SIGTERM); 

     signal_monitor.async_wait(
      boost::bind(&Server::handle_signal_caught, this) 
     ); 
    } 

    void run() { 
     // comment out the next line and there's no segfault 
     connection.reset(new Connection(io_service)); 

     io_service.run(); 
    } 

private: 
    void handle_signal_caught() { 
     io_service.stop(); 
    } 

    boost::shared_ptr<Connection> connection; 
    boost::asio::io_service io_service; 
    boost::asio::signal_set signal_monitor; 
}; 

int main(int argc, char **argv) { 
    Server server; 
    server.run(); 

    return 0; 
} 

내가 신호 (CTRL + C) 대신에 잘 종료의 프로그램 세그먼테이션 폴트 (segfault)를 보낼 때. 나는 지난 30 분을 보면서 이것을 보았지만, 왜 이것이 왜 세그 폴트하는지 알지 못한다. 혹시 너희들이 문제를 발견 할 수 있을까?

답변

7

제가이 문제를 발견했다고 생각합니다.

boost::shared_ptr<Connection> connection; 
boost::asio::io_service io_service; 
boost::asio::signal_set signal_monitor; 

파괴 명령이 선언의 반대 순서로 수행됩니다 Server의 멤버의 선언 순서를합니다. 즉, 먼저 signal_monitor, 그 다음에 io_service 그리고 마지막으로 connection이 파괴됩니다. 그러나 connection에는 io_service에 대한 참조가 포함 된 boost::asio::ip::tcp::socket이 포함되어있어 파괴되었습니다.

그리고 실제로이 무엇 일어나는 꽤 많이, 너무 세그먼트 폴트가 발생합니다 io_service

connection 선언
int main(int argc, char **argv) { 
    auto io_service = new boost::asio::io_service(); 
    auto socket = new boost::asio::ip::tcp::socket(*io_service); 

    delete io_service; 
    delete socket; 

    return 0; 
} 

문제를 해결합니다.

지옥