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

是否存在创建带自定义析构函数的可共享对象的标准方式?及类std::shared_ptr无指向的标准类型?

C++ 共享对象相关问题解答

问题1:是否存在一种标准方式来创建带有自定义析构函数的可共享对象?

有,直接使用std::shared_ptr配合自定义删除器即可,这是标准库提供的原生方案:

// 示例:自定义删除器处理对象销毁
struct MyObject { /* ... */ };

auto custom_deleter = [](MyObject* ptr) {
    // 执行自定义清理逻辑,比如释放关联资源、打日志
    delete ptr;
};

// 构造带自定义删除器的shared_ptr
std::shared_ptr<MyObject> shared_obj(new MyObject(), custom_deleter);

如果不需要实际持有对象,只是想利用shared_ptr的引用计数触发清理逻辑,也可以结合空指针和删除器实现(对应第二个问题的场景)。

问题2:是否存在类似std::shared_ptr但不指向任何内容的标准类型?

C++标准库目前没有专门提供这种"仅持有引用计数+自定义析构逻辑"的类型,但可以基于std::shared_ptr实现简洁的替代方案,完全不用你现在用的占位int*:

方案1:用std::shared_ptr配合空指针

这是最简洁的方式,直接传入nullptr和自定义删除器,不需要任何占位内存:

// 当最后一个guard副本销毁时,自动执行删除器里的逻辑
std::shared_ptr<void> guard(nullptr, [](void*) {
    // 这里写你需要触发的清理操作
});

它具备std::shared_ptr的所有特性:可复制/移动、引用计数、类型安全(删除器逻辑是确定的),而且构造代码非常简洁。

方案2:语义更清晰的标签类型封装

如果想要更明确的类型语义,可以定义一个空标签类型,用它的指针来构造shared_ptr:

struct EmptyGuardTag {};

std::shared_ptr<EmptyGuardTag> guard(new EmptyGuardTag(), [](EmptyGuardTag*) {
    // 执行清理逻辑
});

这种方式会分配极小的内存(空结构体的大小通常是1字节),但语义上更清晰,能明确表示这是一个"无对象的共享守卫"。

注意:默认构造的std::shared_ptr是空状态,不会触发任何删除器逻辑,必须在构造时显式传入删除器才能实现你要的效果。


内容的提问来源于stack exchange,提问作者Spongman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:35:50