Repository navigation
Description
#36284 asked for clarity about how to use Box<[T]>::into_raw. The core issue was that the documentation for Vec::into_boxed_slice said it reduced excess capacity in a way that was equivalent to calling Vec::shrink_to_fit. However, the latter makes no guarantees about there being no excess capacity afterwards. The resolution of #36284 (specifically in #36284 (comment)) was for Vec::into_boxed_slice to itself guarantee that it results in an exact allocation with no excess capacity, and to decouple it from Vec::shrink_to_fit. The documentation was updated to reflect this guarantee in #44960.
#120110 reintroduced the equivalence to Vec::shrink_to_fit, and removed the guarantee by removing this language:
/// If `v` has excess capacity, its items will be moved into a
/// newly-allocated buffer with exactly the right capacity.
I note however that the PR did not update the example, which still appears to encode the intention of the guarantee (it checks the post-shrinking capacity is exactly the length, vs the corresponding example in Vec::shrink_to_fit which checks the post-shrinking capacity is at least the length).
As such, it is unclear whether this guarantee regression was intentional or not. But as things currently stand, we are back in a position where Box<[T]>::into_raw is functionally useless.
Version with regression
#120110 was merged during the 1.77.0 cycle.
Activity
the8472 commentedon Jun 4, 2024
"exact capacity" wording is obsolete due to memory fitting. For example reserve_exact was updated to reflect that.
The intent is that
into_boxed_sliceandshrink_to_fitreturn a fitting allocation. Which means it might have some excess capacity but it's ok to treat it as-iflength == capacitywhen reconstituting it.str4d commentedon Jun 5, 2024
If that is the case, then the guarantee remains in place and it would be good to update the documentation again to re-introduce language that guarantees it.
For avoidance of doubt, this is the code that I want to ensure is guaranteed to work (and that to my understanding has been guaranteed to work since 2017), in that it should correctly deallocate all allocated memory:
the8472 commentedon Jul 10, 2024
We discussed this during today's libs-meeting.
We're ok with a documentation update. The behavior is still in place, but now more nuanced due to the unstable Allocator API which introduces the concept of fitting which GlobalAlloc does not have.
Vec::shrink_to_fitalready refers to the Allocator API, sointo_boxed_slicecan do that too.It can say something along the line that the length of the returned slice is appropriate for sized deallocation APIs without using the "exact capacity" wording and also refer to the memory fitting section.
heiseish commentedon Feb 20, 2025
I can try to update the doc
@rustbot claim
Walentalien commentedon Oct 6, 2026
picking up after #137546 was closed for inactivity.
@rustbot claim