mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-29 16:37:13 +00:00
Introduce struct custom_deleter
to ensure the deleter is moved as desired (the lambda function only captures a reference, which can become dangling).
This commit is contained in:
parent
435d3864a1
commit
17098eb760
@ -68,8 +68,6 @@ static constexpr bool type_has_shared_from_this(const std::enable_shared_from_th
|
||||
return true;
|
||||
}
|
||||
|
||||
struct smart_holder;
|
||||
|
||||
struct guarded_delete {
|
||||
std::weak_ptr<void> released_ptr; // Trick to keep the smart_holder memory footprint small.
|
||||
std::function<void(void *)> del_fun; // Rare case.
|
||||
@ -110,10 +108,16 @@ guarded_delete make_guarded_builtin_delete(bool armed_flag) {
|
||||
return guarded_delete(builtin_delete_if_destructible<T>, armed_flag);
|
||||
}
|
||||
|
||||
template <typename T, typename D>
|
||||
struct custom_deleter {
|
||||
D deleter;
|
||||
custom_deleter(D &&deleter) : deleter{std::move(deleter)} {}
|
||||
void operator()(void *raw_ptr) { deleter(static_cast<T *>(raw_ptr)); }
|
||||
};
|
||||
|
||||
template <typename T, typename D>
|
||||
guarded_delete make_guarded_custom_deleter(D &&uqp_del, bool armed_flag) {
|
||||
return guarded_delete(std::function<void(void *)>(
|
||||
[&uqp_del](void *raw_ptr) { uqp_del(static_cast<T *>(raw_ptr)); }),
|
||||
return guarded_delete(std::function<void(void *)>(custom_deleter<T, D>(std::move(uqp_del))),
|
||||
armed_flag);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user