tag:blogger.com,1999:blog-10303035.post113278599131726902..comments2024-02-04T23:20:04.066+03:00Comments on Алёна C++: Освобождение памяти, выделенной под vectorAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-10303035.post-77701160374744472152016-10-13T13:58:20.054+03:002016-10-13T13:58:20.054+03:00Просит удаления неиспользуемых мощностей.
Это необ...Просит удаления неиспользуемых мощностей.<br />Это необязательный просьбой сократить capacity в size. Это зависит от реализации, если запрос выполняется. <br />void shrink_to_fit(); // (начиная с C++11)<br /><br />Пример:<br />std::vector v;<br /> v.clear(); // очищает содержимое вектора .<br /> v.shrink_to_fit(); // сокращает зарезервированный размер памяти вектора .Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-48555460919688795932015-07-23T19:16:13.127+03:002015-07-23T19:16:13.127+03:00Ни .clear(), ни reserve(x) у меня память не освобо...Ни .clear(), ни reserve(x) у меня память не освобождают.<br />Освободить память удаётся только так: std::vector().swap(vec);Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-53507426896491172242013-07-24T21:06:17.456+04:002013-07-24T21:06:17.456+04:00Бьерн Страуструп:
Уменьшение размеров вектора не...Бьерн Страуструп:<br /> <br />Уменьшение размеров вектора не уменьшает его его емкости. Чтобы вернуть память системе, нужно сделать следующий трюк:<br /><br />vector tmp = v;<br />v.swap(tmp);Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-46935228267400708172008-02-13T12:13:00.000+03:002008-02-13T12:13:00.000+03:002Анонимный:size() и capacity() - не есть одно и то...<B>2Анонимный:</B><BR/><I>size() и capacity() - не есть одно и то же.</I><BR/><BR/>Я в курсе :-)<BR/><BR/><I>1) аллокацию нового пула (скорее всего, вдвое большего, чем раньше)</I><BR/><BR/>Вдвое больший пул использовался в старых компиляторах, в VC++6.0, например. Он ведет к довольно неэффективному использованию памяти. В VC++7 уже используется константа 1.5.<BR/><BR/><I>Если Вам не нравится такое поведение</I><BR/><BR/>Речь идет об освобождении памяти, выделенной под вектор, а не о выборе контейнеров...Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-14908390035674935302008-02-12T23:50:00.000+03:002008-02-12T23:50:00.000+03:00size() и capacity() - не есть одно и то же. Память...size() и capacity() - не есть одно и то же. Память изначально выделяется с некоторым запасом, чтобы при добавлении элементов в вектор не было постоянной переаллокации (ибо это тормоза, чем дальше - тем больше). Так что, capacity() говорит о размере пула памяти, выделеной данному вектору, а вот size() - это кол-во элементов, которые реально используются из этого пула. <BR/>Когда capacity() == size(), вставка очередного элемента вызовет <BR/>1) аллокацию нового пула (скорее всего, вдвое большего, чем раньше)<BR/>2) копирование содержимого старого пула в новый <BR/>3) освобождение старого пула<BR/>Если Вам не нравится такое поведение - смотрите на другие контейнеры, например, лист (двусвязный список).Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1143294811985466562006-03-25T16:53:00.000+03:002006-03-25T16:53:00.000+03:00Я бы использовал тут слово "стандартно" вместо "пр...Я бы использовал тут слово "стандартно" вместо "правильно", потому как правильно было б не освобождать память. Освобождение исключает возможность повторного использования уже выделенной памятиAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-1133184266378625712005-11-28T16:24:00.000+03:002005-11-28T16:24:00.000+03:00For doing this portably, you need to write your ow...For doing this portably, you need to write <B>your own</B> allocator... :-(Anonymousnoreply@blogger.com