提升共享指针自定义删除器示例

boost shared pointer custom deleter example

本文关键字:删除 自定义 共享 指针      更新时间:2023-10-16

>我正在使用libmodbus库。 我需要在线程之间传递modbus_t指针的实例。我很难只使用原始指针,我认为我可以解决将boost_shared_ptr与自定义删除器一起使用的问题。

我没有遇到任何编译器问题,但是当我运行程序时,它会崩溃。我希望是否有人能给我一个使用自定义删除器增强共享指针的使用示例。

程序在OpenModBusConnection((函数中第一次调用m_mb.reset((的行崩溃。

m_mb = boost::shared_ptr<modbus_t>( modbus_new_rtu(m_heatercomport.c_str(),9600,'N',8,1), freemodbus);
    void freemodbus(modbus_t *mb)
    {
       if(mb != NULL)
       {
          modbus_close(mb);
          modbus_free(mb);      
       }
    }
    void OpenModBusConnection()
    {
        if(m_mb.get() != NULL)
        {           
            wxString msg("Closing port "");
            msg.append(m_heatercomport);
            msg.append("" modbus port ");
            wxLogMessage(msg);
            readoutput->AppendText("Modbus Connection Closedn");
            m_mb.reset();
        }
        // open modbus connection
        m_mb.reset();
        modbus_set_slave(m_mb.get(),1);
        if(modbus_connect(m_mb.get()) == -1)
        {
            wxString msg("Failed to open port "");
            msg.append(m_heatercomport);
            msg.append("" modbus port ");
            wxLogMessage(msg);
            readoutput->AppendText("Modbus Connection Failedn");
            return false;
        }
        else
        {
            wxString msg("Opening port "");
            msg.append(m_heatercomport);
            msg.append("" modbus port ");
            wxLogMessage(msg);
            readoutput->AppendText("Modbus Connection Establishedn");
            return true;
        }
    }

我收到的错误消息是

First-chance exception at 0x7717bb47 in test.exe: 0xC0000008: An invalid handle was specified.
m_mb.reset();
modbus_set_slave(m_mb.get(),1);
if(modbus_connect(m_mb.get()) == -1)

这实际上与

m_mb.reset();
modbus_set_slave(nullptr,1);
if(modbus_connect(nullptr) == -1)

如果您想释放并将m_mb重置回新的modbus句柄,您需要这样做

m_mb = boost::shared_ptr<modbus_t>( modbus_new_rtu(m_heatercomport.c_str(),9600,'N',8,1), freemodbus); 

再次明确。