首页 > 解决方案 > 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";
}

标签: c++unique-ptr

解决方案


老实说,自定义删除器可以是一切。让我们弄脏我们的手,

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


推荐阅读