C++ boost::asio:io\U服务的共享\U ptr断言错误

C++ boost::asio:io\U服务的共享\U ptr断言错误,c++,boost,shared-ptr,assertion,C++,Boost,Shared Ptr,Assertion,我目前正在尝试理解boost::asio API。在我的一个类中,我使用boost::shared_ptr以这种方式引用io_服务: class myClass : public boost::asio::serial_port { public: myClass(std::string Port); private: boost::shared_ptr<boost::asio::io_Service> _io_service_ptr; }; 当我这样做时,我得

我目前正在尝试理解boost::asio API。在我的一个类中,我使用boost::shared_ptr以这种方式引用io_服务:

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

private:
    boost::shared_ptr<boost::asio::io_Service> _io_service_ptr;
};
当我这样做时,我得到一个错误:断言失败!px!=0[…]


当对其他boost::asio对象(如boost::asio::io_service::work(service))使用相同的模式时,它可以正常工作。io_服务有什么问题吗?

基类在成员之前进行初始化,因此在尝试取消对未初始化指针的引用以传递对基类的引用之后,
io_服务才会创建

但是从
串口派生出来似乎有些奇怪;为什么不使用聚合呢?确保在使用服务之前先声明服务:

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;
};

当然是。。。谢谢。我都没想到^^
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;
};