You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带有自定义删除器的unique_ptr作为类成员?

如何将带有自定义删除器的unique_ptr作为类成员?

嘿,我来给你讲清楚怎么把带自定义删除器的unique_ptr当成类成员来用哈~

首先得明确:带自定义删除器的std::unique_ptr,它的类型是包含删除器类型的,所以不能像普通unique_ptr那样只写std::unique_ptr<GDBusConnection>,得把删除器的类型也带上才行。

就拿你给出的GDBusConnection和g_object_unref删除器的例子来说,咱们一步步来:

第一步:在类里声明成员变量

首先在类的私有部分(或者需要的访问权限里)声明这个unique_ptr成员,类型要包含删除器的类型。这里咱们可以用decltype(&g_object_unref)来自动推导删除器的函数指针类型,不用手动写复杂的函数指针声明:

#include <glib.h>
#include <memory>

class MyBusClass {
private:
    // 声明带自定义删除器的unique_ptr成员
    std::unique_ptr<GDBusConnection, decltype(&g_object_unref)> m_bus_conn;

第二步:初始化成员变量

因为带函数指针类型删除器的unique_ptr不能默认构造(它需要知道具体的删除器函数),所以咱们得在构造函数里初始化它。有两种灵活的方式:

方式一:直接初始化连接并绑定删除器

public:
    MyBusClass() {
        GError* error = nullptr;
        // 直接创建连接并绑定删除器赋值给成员
        m_bus_conn = std::unique_ptr<GDBusConnection, decltype(&g_object_unref)>(
            g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error),
            &g_object_unref
        );

        if (!m_bus_conn) {
            std::cerr << "Couldn't get bus: " << (error ? error->message : "Unknown error") << std::endl;
            if (error) g_error_free(error);
        }
    }
};

方式二:先初始化空指针+删除器,再用reset赋值

这种方式适合需要先做一些前置检查,再创建连接的场景:

public:
    MyBusClass() : m_bus_conn(nullptr, &g_object_unref) { // 先初始化空指针和删除器
        GError* error = nullptr;
        // 用reset设置实际的连接指针
        m_bus_conn.reset(g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error));

        if (!m_bus_conn) {
            std::cerr << "Couldn't get bus: " << (error ? error->message : "Unknown error") << std::endl;
            if (error) g_error_free(error);
        }
    }
};

小技巧:用类型别名简化代码

如果觉得std::unique_ptr<GDBusConnection, decltype(&g_object_unref)>写起来太长,可以提前定义一个类型别名,后续复用更方便:

// 定义类型别名
using DBusConnectionPtr = std::unique_ptr<GDBusConnection, decltype(&g_object_unref)>;

class MyBusClass {
private:
    DBusConnectionPtr m_bus_conn;
    // ... 后续代码和上面一致
};

这样整个代码看起来清爽很多,不管是类内还是其他地方使用这个指针类型,直接用DBusConnectionPtr就行。

备注:内容来源于stack exchange,提问作者parsley72

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:58:07