shared_ptr 提供了定制析构功能的能力。通过使用自定义的删除器(deleter),可以在 shared_ptr 释放资源时执行特定的清理操作。

下面是使用自定义删除器的示例:

#include <iostream>
#include <memory>

struct Resource
{
    Resource() { std::cout << "Resource acquired." << std::endl; }
    ~Resource() { std::cout << "Resource released." << std::endl; }
};

void CustomDeleter(Resource* resource)
{
    std::cout << "Custom deleter called." << std::endl;
    delete resource;
}

int main()
{
    std::shared_ptr<Resource> sharedResource(new Resource(), CustomDeleter);

    // 使用 sharedResource...

    return 0;
}

在 main 函数中,我们使用 std::shared_ptr 创建了一个指向 Resource 对象的智能指针 sharedResource,并将自定义删除器传递给它。

通过使用自定义删除器,可以灵活地管理资源的释放过程,以满足特定的需求。

  1. 管理非常规资源释放:有些资源可能不是通过简单的 delete 进行释放,而是需要调用特定的函数、方法或接口来释放。通过使用自定义删除器,可以将这种特定的释放逻辑封装在自定义删除器中,确保资源以正确的方式被释放。
  2. 处理资源的引用计数:除了释放资源,自定义删除器还可以用于执行其他操作,如更新资源的引用计数。例如,当资源被最后一个 shared_ptr 释放时,可以在自定义删除器中执行某些额外的操作,如通知其他相关组件或修改全局状态。
  3. 与第三方库集成:第三方库可能要求使用特定的释放函数或接口来释放资源,而不是直接调用 delete。通过自定义删除器,可以将第三方库所需的资源释放逻辑与 shared_ptr 集成起来,使其能够与现有的智能指针机制协同工作。

总之,自定义删除器允许您在释放资源时执行自定义的操作,以满足特定的需求。它提供了更大的灵活性和可扩展性,使 shared_ptr 能够处理各种类型的资源,并与其他组件和库集成。

使用customdelete与直接改写对应资源类的析构函数有什么区别呢?