boost::shared_ptr Ошибка утверждения с boost::asio:io_service

В настоящее время я пытаюсь понять boost::asio-API. в одном из моих классов я использую boost::shared_ptr для ссылки на io_service следующим образом:

class myClass : public boost::asio::serial_port
{
public: 
    myClass(std::string Port);

private:
    boost::shared_ptr<boost::asio::io_Service> _io_service_ptr;
};

И реализация в соответствии с этим:

myClass::myClass(std::string Port) : _io_service_ptr(new boost::asio::io_service), 
boost::asio::serial_port(*_io_service_ptr, Port)
{
    //do stuff
}

Когда я это делаю, я получаю сообщение об ошибке: Утверждение не удалось! px != 0 [...]

При использовании того же шаблона для других объектов boost::asio (например, boost::asio::io_service::work(service)) он работает нормально. Что я сделал не так с io_service?


person FreddyKay    schedule 06.03.2014    source источник


Ответы (1)


Базовые классы инициализируются перед членами, поэтому io_service не создается до тех пор, пока вы не попытаетесь разыменовать неинициализированный указатель, чтобы передать ссылку на базовый класс.

Но происхождение от serial_port кажется довольно странным; почему бы не использовать агрегацию вместо этого? Убедитесь, что служба объявлена ​​до всего, что ее использует:

class myClass {
public:
    myClass(std::string port) : serial_port(io_service, port) {}

    // public interface to interact with the serial port and whatever else

private:
    boost::asio::io_service io_service; // or a shared pointer if there's a good reason
    boost::asio::serial_port serial_port;
};

Также вероятно, что вы захотите разделить один сервис со многими объектами, поэтому, возможно, он вообще не должен принадлежать этому классу:

class myClass {
public:
    myClass(boost::asio::io_service & io_service, std::string port) : 
        serial_port(io_service, port) 
    {}

    // public interface to interact with the serial port and whatever else

private:
    boost::asio::serial_port serial_port;
};
person Mike Seymour    schedule 06.03.2014
comment
конечно они... большое спасибо. даже не подумал об этом ^^ - person FreddyKay; 06.03.2014