提升共享指针自定义删除器示例
boost shared pointer custom deleter example
我正在使用 libmodbus 库。我需要在线程之间传递 modbus_t 指针的实例。我对原始指针有困难,我想我可以通过使用 boost_shared_ptr 和自定义删除器来解决问题。
我没有遇到任何编译器问题,但是当我 运行 程序崩溃时。
我希望有人能给我一个带有自定义删除器的 boost 共享指针的用法示例。
程序在 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 Closed\n");
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 Failed\n");
return false;
}
else
{
wxString msg("Opening port \"");
msg.append(m_heatercomport);
msg.append("\" modbus port ");
wxLogMessage(msg);
readoutput->AppendText("Modbus Connection Established\n");
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);
再次明确。
我正在使用 libmodbus 库。我需要在线程之间传递 modbus_t 指针的实例。我对原始指针有困难,我想我可以通过使用 boost_shared_ptr 和自定义删除器来解决问题。
我没有遇到任何编译器问题,但是当我 运行 程序崩溃时。 我希望有人能给我一个带有自定义删除器的 boost 共享指针的用法示例。
程序在 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 Closed\n");
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 Failed\n");
return false;
}
else
{
wxString msg("Opening port \"");
msg.append(m_heatercomport);
msg.append("\" modbus port ");
wxLogMessage(msg);
readoutput->AppendText("Modbus Connection Established\n");
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);
再次明确。