是否存在创建带自定义析构函数的可共享对象的标准方式?及类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
相关产品推荐
相关产品推荐

