【问题标题】:boost::shared_ptr Assertion error with boost::asio:io_serviceboost::shared_ptr boost::asio:io_service 的断言错误
【发布时间】:2014-03-06 16:00:31
【问题描述】:

我目前正在尝试了解 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
}

当我这样做时,我收到错误:断言失败!像素!= 0 [...]

当对其他 boost::asio 对象(如 boost::asio::io_service::work(service))使用相同的模式时,它可以正常工作。我对 io_service 做错了什么?

【问题讨论】:

    标签: c++ boost shared-ptr assertion


    【解决方案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;
    };
    

    【讨论】:

    • 当然是……非常感谢。没想到^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多