This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [Patch]New feature to all kind of stl container.vector::data_move() returns vector::data() that can be moved,just as unique_ptr::release() to unique_ptr::get()
- From: Jonathan Wakely <jwakely dot gcc at gmail dot com>
- To: Federico Terraneo <fede dot tft at hotmail dot it>
- Cc: "libstdc++" <libstdc++ at gcc dot gnu dot org>
- Date: Thu, 8 Jan 2015 16:20:45 +0000
- Subject: Re: [Patch]New feature to all kind of stl container.vector::data_move() returns vector::data() that can be moved,just as unique_ptr::release() to unique_ptr::get()
- Authentication-results: sourceware.org; auth=none
- References: <tencent_1737FA275BA843B20700F485 at qq dot com> <alpine dot DEB dot 2 dot 11 dot 1501080815100 dot 1564 at laptop-mg dot saclay dot inria dot fr> <CAH6eHdRJ7XGw1m6ntK+sBtyM70yvvqUmz-LxQdPrUH8bT4SY7g at mail dot gmail dot com> <alpine dot DEB dot 2 dot 11 dot 1501081246410 dot 31658 at stedding dot saclay dot inria dot fr> <tencent_215CF4C848ACCCEF53C7F318 at qq dot com> <CAH6eHdSY1_YDN1DMRCjnFRFLsn2Ju9ScJD7VoYJFpfEkwiurTw at mail dot gmail dot com> <BLU436-SMTP1570464BA0B53AC052C47D8F9470 at phx dot gbl>
On 8 January 2015 at 16:07, Federico Terraneo wrote:
> My (perhaps limited) understanding of how vector works is that it
> allocates objects with placement new on a potentially larger chunk of
> memory due to capacity() being possibly greater than size().
>
> So assuming a client would attempt to call data_move() on a vector of
> objects that need a destructor to be disposed of, he/she would have a
> hard time to safely deallocate that array of objects, as neither
> delete[] nor delete would be appropriate. The proper way to do it
> would be to call size() on the vector before data_move(), store the
> number of elements somewhere, and when it's time to dellocate the
> objects call placement delete on the first size() elements, afterwards
> deallocate the chunk of memory. Not impossible, but not intuitive.
>
> Moreover, vector allocates its memory using an allocator, not directly
> through new/delete so even in the case of a vector of int or other
> destructor-less data types, using delete[]/free() would be inappropriate.
Yes, what you need to do it properly is a type that stores the
allocator, stores the number of elements allocated (the capacity) and
stores the number of elements constructed (the size).
That type already exists and is called std::vector.