Question about following shared_ptr
constructor:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
Am I correct that if r
was created using user-provided deleter, then aliasing shared_ptr
knows that. So if aliasing shared_ptr
is last in the group and (when going out of scope) destructs resources originally managed by r
, it will use that user-provided deleter?
Example:
#include <iostream>
#include <iomanip>
struct some_type
{
int i;
};
void my_deleter(some_type* p)
{
std::cout << "my_deleter called!" << std::endl;
delete p;
}
#include <memory>
int main()
{
std::shared_ptr<int> pm;
{
// Note: better use make_shared
auto x = new some_type;
// create a shared_ptr that owns x and a deleter
std::shared_ptr<some_type> r(x, &my_deleter);
std::cout << r.use_count() << std::endl;
// share ownership of x and the deleter with pm
pm = std::shared_ptr<int>(r, &r->i);
std::cout << r.use_count() << std::endl;
// r gets destroyed
}
std::cout << pm.use_count() << std::endl;
std::cout << "get_deleter == 0? " << std::boolalpha
<< (nullptr == std::get_deleter<decltype(&my_deleter)>(pm))
<< std::endl;
}
Output:
1 2 1 get_deleter == 0? false my_deleter called!
N.B. I can't compile this example with a free function my_deleter
, there's some casting error for the free get_deleter
function (trying to cast from void*
to a function pointer type with a static_cast
).
Aliasing ctor: [util.smartptr.shared.const]/13-14
template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
13 Effects: Constructs a
shared_ptr
instance that storesp
and shares ownership withr
.14 Postconditions:
get() == p && use_count() == r.use_count()
Ctor with user-provided deleter: [util.smartptr.shared.const]/9
template shared_ptr(Y* p, D d);
Effects: Constructs a
shared_ptr
object that owns the objectp
and the deleterd
.
Dtor: [util.smartptr.shared.dest]/1
~shared_ptr();
1 Effects:
- If
*this
is empty or shares ownership with anothershared_ptr
instance (use_count() > 1
), there are no side effects.- Otherwise, if
*this
owns an objectp
and a deleterd
,d(p)
is called.- Otherwise,
*this
owns a pointerp
, anddelete p
is called.
Combining those (let's skip the assignment operators):
shared_ptr
instance r
owns both the object and the deleter.shared_ptr
instance share ownership with r
(i.e. for both, the object and the deleter).use_count > 1
, no effects.r
pointed to and the deleter (if any) and will either use this deleter (if it exists) or delete
on the object pointed to.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With