debug vector move issue

François Dumont francois.cppdevs@free.fr
Fri Sep 17 11:15:00 GMT 2010


On 09/15/2010 10:47 PM, Jonathan Wakely wrote:
>> When compiled with the necessary attached patch on debug vector it works
>> fine. However when you define _GLIBCXX_DEBUG_PEDANTIC the test a.capacity()
>> == r.capacity() fails. This is because when you create a normal vector by
>> moving a debug one internal memory is transferred but the debug vector
>> _M_guaranteed_capacity is not reseted. This result in the test by the moved
>> debug vector instance 'a' announcing a capacity of 1 when in fact it is 0.
>>
>> I see no real good solution to this problem, _M_guarantied_capacity seemed
>> to be impossible to maintain when the debug container is moved. Maybe
>> putting this data in the allocator could help, I need to investigate.
>>
>> Any thoughts ?
>>      
> (I haven't looked in detail or refreshed my memory of how the debug
> vector works, I've only looked at your attachments)
>
> Can't the move constructor and move assignment set
> __x._M_guaranteed_capacity = 0 ?
>    
The problem is just that we can't because we are moving a debug vector 
to a normal vector. It is the normal vector move constructor that is 
called with a rvalue reference to the debug one seen as a normal vector 
because the debug inherits from the normal. How do you want to know in 
the normal move constructor that the source has a _M_guaranteed_capacity 
that needs to be reseted, that is impossible.
> As Paolo said, the test seems invalid to me, it's trying to verify
> something which is not guaranteed (and in general cannot be.)
>    
Well, I agree that the test is a little bit weird even if it is 
surprising that depending on the way you look at a given instance, as a 
debug one or as a normal one, the capacity returns different values. A 
test that will perhaps looks better for you is:

__gnu_debug::vector<int> dv({0, 1, 2, 3, 4});
std::vector<int> v(std::move(dv));
VERIFY(dv.capacity() == 0);

Once moved the debug vector should be empty without any internal buffer 
left, and in fact it is like that, but capacity still announce 5 even if 
as soon as an element will be added a new buffer will be allocated.

Francois
> Apologies if my cursory glance has meant I missed something!
>
> Jonathan
>    



More information about the Libstdc++ mailing list