Possible bug in shared_ptr(unique_ptr) constructor?

Jonathan Wakely jwakely.gcc@gmail.com
Mon Oct 7 17:21:00 GMT 2013


On 7 October 2013 18:01, Daniel Krügler <daniel.kruegler@gmail.com> wrote:
> 2013/10/7 Jonathan Wakely <jwakely.gcc@gmail.com>:
>> And here's a suggested patch to fix it:
>>
>> +      template<typename _Sp, typename _Up>
>> +       static _Sp_counted_base<_Lp>*
>> +       _S_do_create_from_up(_Up&& __r)
>> +       {
>> +         using _Alloc = std::allocator<_Sp>;
>> +         using _ATr = std::allocator_traits<_Alloc>;
>> +         _Alloc __a;
>> +         auto __ptr = _ATr::allocate(__a, 1);
>> +         _ATr::construct(__a, __ptr, __r.get(), __r.get_deleter());
>> +         return __ptr;
>>         }
>
> Question: Is it impossible that the construction could throw an
> exception here or why is there no need to RAII-protect the
> intermediate __ptr value?

It's a good question.  All constructors of _Sp_counted_deleter are
noexcept, on the basis that the allocator's copy constructor and the
deleter's copy constructor must not throw according to
[util.smartptr.shared.const]/8.

If a user specializes std::allocator<_Sp_counted_deleter<...>> (or the
corresponding allocator_traits) and makes the construct() function
throw then they get to keep the pieces :-)

So I don't think we need to protect against exceptions here (although
I'll think about it more carefully before I commit the patch.)



More information about the Libstdc++ mailing list