Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make unique_ptr's with non-default deleters work #384

Merged
merged 1 commit into from Sep 4, 2016

Conversation

jagerman
Copy link
Member

@jagerman jagerman commented Sep 4, 2016

Currently pybind11 only supports std::unique_ptr<T> holders by default (other holders can, of course, be declared using the macro). PR #368 added a py::nodelete that is intended to be used as:

py::class_<Type, std::unique_ptr<Type, py::nodelete>> c("Type");

but this doesn't work out of the box. (You could add an explicit holder type declaration, but this doesn't appear to have been the intention of the commit).

This commit fixes it by generalizing the unique_ptr type caster to take both the type and deleter as template arguments, so that any unique_ptr types are now automatically handled by pybind (not just py::nodelete). It also adds a test to test_smart_ptr, testing both that py::nodelete (now) works, and that the py::nodelete-managed object is indeed not deleted as intended.

Currently pybind11 only supports std::unique_ptr<T> holders by default
(other holders can, of course, be declared using the macro).  PR pybind#368
added a `py::nodelete` that is intended to be used as:

    py::class_<Type, std::unique_ptr<Type, py::nodelete>> c("Type");

but this doesn't work out of the box.  (You could add an explicit
holder type declaration, but this doesn't appear to have been the
intention of the commit).

This commit fixes it by generalizing the unique_ptr type_caster to take
both the type and deleter as template arguments, so that *any*
unique_ptr instances are now automatically handled by pybind.  It also
adds a test to test_smart_ptr, testing both that py::nodelete (now)
works, and that the object is indeed not deleted as intended.
@jagerman
Copy link
Member Author

jagerman commented Sep 4, 2016

(The travis-ci build failure is a minor style failure coming from master, not this commit).

@wjakob
Copy link
Member

wjakob commented Sep 4, 2016

Great -- I never thought to make this change.

@wjakob wjakob merged commit 614988c into pybind:master Sep 4, 2016
@jagerman jagerman deleted the unique-ptr-non-default-deleters branch September 9, 2016 15:51
@rwgk rwgk mentioned this pull request Feb 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants