ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] 参考: https://blog.csdn.net/breaksoftware/article/details/82780116 参考: https://liam.page/2020/04/21/managing-FILE-pointer-by-std-unique-ptr/ ## 用`std::unique_ptr`实现 熟悉`std::unique_ptr`的读者不难发现,这其实就是一个经典的适合独占类型的智能指针发挥作用的场景。不过,`std::unique_ptr`的默认删除函数是销毁其占有的指针指向的对象,亦即执行`delete p_`。但是,对于文件流来说,我们需要在智能指针完成使命之后关闭文件。 ``` template< class T, class Deleter = std::default_delete<T> > class unique_ptr; ``` 为此,我们需要使用自定义的删除函数。也就是说,我们要给模板参数`Deleter`传入一个合适的参数。这个参数应当是以下三者之一: * 接受`std::unique_ptr<T, Deleter>::pointer`作为参数的函数对象; * 接受`std::unique_ptr<T, Deleter>::pointer`作为参数的函数对象的左值引用; * 接受`std::unique_ptr<T, Deleter>::pointer`作为参数的函数。 换言之,我们得给`Deleter`传这么个东西进去:`std::function<void(typename std::unique_ptr<T, Deleter>::pointer)>`。于是有代码。 ``` #include <iostream> #include <fstream> #include <memory> #include <functional> void close_file(FILE* fp) { fclose(fp); } using FileHandler = std::unique_ptr<FILE, std::function<void(FILE*)>>; int main() { std::ofstream("demo.txt") << 'x'; // ensure the file does exist FileHandler fp(fopen("demo.txt", "r"), close_file); if (nullptr != fp) { std::cout << static_cast<char>(fgetc(fp.get())) << std::endl; } return 0; } ```