1

我正在使用 C++ std::shared_ptr 并且想知道除了覆盖删除 ptr 之外,自定义删除器是否还有其他用途。或者建议为 shared_ptr 提供自定义 delter 的场景是什么

4

4 回答 4

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");
}
于 2013-10-09T22:54:32.820 回答
1

您不一定需要明确地拼出删除器。但是该类需要具有允许各种类型擦除的功能,例如从 any 构造 ashared_ptr<T>和从 anyunique_ptr<T, D>构造shared_ptr<void>a shared_ptr<T>。当您第一次创建对象时,默认删除器就在那里,它们会随着所有这些转换传播。

有时您可以将自定义删除器用于其他类型的资源管理,尽管大多数情况下 aunique_ptr可能更适合这些情况。

于 2013-10-09T20:59:52.330 回答
1

你需要一个自定义删除器,什么时候delete不会做你想做的事。考虑不同的场景:

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

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

于 2013-10-09T21:28:34.640 回答
0

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

  1. 给你一种方法来覆盖delete ptr;(如你所说)。
  2. 使 shared_ptr 和 unique_ptr 无法与前向声明类一起使用。
于 2013-10-09T21:03:32.717 回答