How do I use a custom deleter with a std::unique_ptr member?

c++, c++11, move-semantics, unique-ptr

Solution

Assuming that `create` and `destroy` are free functions (which seems to be the case from the OP's code snippet) with the following signatures:

Bar* create();
void destroy(Bar*);

You can write your class `Foo` like this

class Foo {

    std::unique_ptr<Bar, void(*)(Bar*)> ptr_;

    // ...

public:

    Foo() : ptr_(create(), destroy) { /* ... */ }

    // ...
};

Notice that you don't need to write any lambda or custom deleter here because `destroy` is already a deleter.

Problem

I have a class with a unique_ptr member. ``` class Foo { private: std::unique_ptr<Bar> bar; ... }; ``` The Bar is a third party class that has a create() function and a destroy() function. If I wanted to use a `std::unique_ptr` with it in a stand alone function I could do: ``` void foo() { std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); }); ... } ``` Is there a way to do this with `std::unique_ptr` as a member of a class?

Original source

Related problems