我正在使用 C++ std::shared_ptr 并且想知道除了覆盖删除 ptr 之外,自定义删除器是否还有其他用途。或者建议为 shared_ptr 提供自定义 delter 的场景是什么
问问题
687 次
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
据我所知,删除器有两个目标。
- 给你一种方法来覆盖
delete ptr;
(如你所说)。 - 使 shared_ptr 和 unique_ptr 无法与前向声明类一起使用。
于 2013-10-09T21:03:32.717 回答