我正在使用C ++ std :: shared_ptr,并希望知道除了覆盖delete ptr之外是否还有其他用于自定义删除器的用法。或者建议为shared_ptr
提供自定义输入的方案是什么答案 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)
据我所知,删除者有两个目标。
delete ptr;
的方式(如你所说)。