c++ - unique_ptr 如何使用自定义删除器功能?
问题描述
为了教育起见,我试图了解智能指针如何与自定义删除器一起使用。所以我自己编写了这段代码来模拟std::uniqe_ptr
工作方式。事实上,我还考虑将删除器模板函数更改为模板函数类,并将其专门用于动态数组。无论如何,这是我尝试过的:
template <typename T>
void Free(T* p)
{
std::cout << "Free(T*): Freeing memory of a dynamic object...\n";
delete p;
}
template <typename T>
void Del_It(T* p)
{
std::cout << "Del_It(T*): freeing memory of a dynamic object...\n";
delete p;
}
template <typename T, typename Deleter=void(*)(T*)>
class Uniptr
{
public:
Uniptr(T* = nullptr, Deleter = Free<T>);
virtual ~Uniptr();
private:
T* ptr_{nullptr};
Deleter delPtr_{nullptr};
};
template <typename T, typename Deleter>
Uniptr<T, Deleter>::Uniptr(T* p, Deleter d) :
ptr_(p),
delPtr_(d)
{
}
template <typename T, typename Deleter>
Uniptr<T, Deleter>::~Uniptr()
{
delPtr_(ptr_);
delPtr_ = nullptr;
}
int main()
{
Uniptr<int, void(*)(int*)> upi(new int(9), Del_It<int>);
std::cout << "\ndone\n";
}
- 看起来它工作正常,但我需要你的建议,提示......谢谢
解决方案
老实说,自定义删除器可以是一切。让我们弄脏我们的手,
int main()
{
auto f = [](FILE* f){std::close(f); std::cout<<"I am closing file\n";};
std::unique_ptr<FILE,decltype(f)>fptr{std::fopen("test.txt","w"), f};
}
我们在这里做了什么?我们已经在 C 中通过unique_ptr
. 我们得到了什么?如果操作后忘记关闭文件,我们确保它会自动关闭。
所以,不要以为自定义删除器只能用来删除指针。可以为任何应用程序指定我,例如套接字、文件等...
请检查unique_ptr
代码取自File Wrapper
推荐阅读
- rust - 如何满足`impl futures::Future:futures::TryStream`的特征界限
- python - 使用 Cloudflare 背后的 API,使用 HTTP Post 和 Requests 库
- mysql - 使用联接时为每个不同的字段值选择随机行
- c - 为什么我使用 gotoxy(x,y) 时没有打印第一列
- jupyter-notebook - 使用 Jupyter Notebook 在降价文本中替换占位符(变量)的最简单方法?
- database - Sqlite 结构
- java - Hadoop Jar FileSystemNotFoundException
- linux - nano中的Ctrl+Z、Ctrl+X和Ctrl+C有什么区别?
- c++ - 不能将 CRTP 用于内部类
- node.js - Mongoose 嵌套查询 - 查找和更新不同文档中的两个字段