使用 typedef 结构提升 shared_ptr

Boost shared_ptr with typedef struct

我在使用 libmodbus 时遇到编译问题。我有以下代码

boost::shared_ptr <modbus_t> ctx;
ctx->modbus_new_tcp(ip_address.c_str(), modbus_port);

但我收到以下错误

error: invalid use of incomplete type 'struct _modbus'

它指向modbus.h中的这一行

typedef struct _modbus modbus_t;

我对此了解不够,无法解决我的问题。你觉得它是什么?这个库与智能指针不兼容吗?他们告诉你使用常规指针

modbus_t* ctx;

谢谢。

事实上,这似乎是一种 C 风格 API,其中他们完全隐藏了 modbus_t 的实现,对您作为用户(因为您将指针传递给自由函数而不是调用对象成员)。

这意味着您不能立即使用 shared_ptr(因为它需要调用 delete 的定义,这也恰好是错误的调用)。 可能 有一种方法可以使用自定义删除器调用适当的清理函数(可能 modbus_free)。然后,您必须在任何时候想要调用 API.

时使用 .get() 来获取原始指针

你可以——或许——使用

if (std::unique_ptr<modbus_t, void(*)(modbus_t*)> mb(modbus_new_tcp(ip_address.c_str(), modbus_port), &modbus_free)) {

    modbus_connect(mb);

    /* Read 5 registers from the address 0 */
    modbus_read_registers(mb, 0, 5, tab_reg);

    modbus_close(mb);
} // modbus_free invoked, even in the case of exception.

当然,这是假设存在唯一所有权。