何时为std :: shared_ptr使用自定义删除器

时间:2013-10-09 20:51:46

标签: c++

我正在使用C ++ std :: shared_ptr,并希望知道除了覆盖delete ptr之外是否还有其他用于自定义删除器的用法。或者建议为shared_ptr

提供自定义输入的方案是什么

4 个答案:

答案 0 :(得分:4)

并非所有内存都分配有new,内存不是唯一需要释放的资源,例如

std::shared_ptr<FILE> open_file(const std::String& path, const std::String& mode)
{
  if (FILE* f = :fopen(path.c_str(), mode.c_str()))
    return std::shared_ptr<FILE>(f, ::fclose);
  throw std::runtime_error("Cannot open file");
}

答案 1 :(得分:1)

您不一定需要明确拼写删除器。但是该类需要具有允许各种类型擦除的功能,例如从任何shared_ptr<T>构建unique_ptr<T, D>,从任何shared_ptr<void>构建shared_ptr<T>。首次创建对象时,默认删除器就在那里,并且它们会在所有这些转换中传播。

有时您可以将自定义删除工具用于其他类型的resource management,但大多数时候unique_ptr可能更适合这些情况。

答案 2 :(得分:1)

delete无法满足您的需求时,您需要自定义删除工具。考虑不同的情况:

您从池中获取内存并使用placement new来创建对象。在未使用delete创建的对象上调用new将是未定义的行为,因此您需要插入将使用相应内存池的删除器。这适用于使用malloc获取并且使用free释放的内存,或者任何其他类型的内存分配器。这也适用于从不同堆中获取的记忆。

资源根本不是内存,而是文件描述符,数据库连接等。删除器需要在没有对该资源的引用时释放资源,但释放资源不涉及调用{{1} ,但是其他一些操作。

答案 3 :(得分:0)

据我所知,删除者有两个目标。

  1. 给你一种覆盖delete ptr;的方式(如你所说)。
  2. 无法将shared_ptr和unique_ptr与前向声明类一起使用。