Форум программистов, компьютерный форум CyberForum.ru

Vector string'ов и освобождение памяти - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
01.10.2011, 17:29     Vector string'ов и освобождение памяти #1
Как известно вектор не освобождает память.
В подавляющем большинстве случаев string работает на основе вектора (т.к. если использовать list - хранить на каждый байт по 2 указателя весьма не эффективно) и тоже не освобождает память.
Допустим я создал вектор из 1000 стрингов содержащих строку 1000 байт каждый.
При этом получился вектор из 1000 элементов размером в 1500 элементов (500 зарезервировано)
И также каждый элемент - string будет содержать 1000 байт текста и 500 резерва.

Понятно что в первых 1000 элементах вектора будет указатели на различные области памяти, в которых хранятся стринги. А что будет в этих 500 зарезрверованных элементах вектора? Там тоже уже будут указатели на какие-то области памяти, в которых будут динамически выделены несколько байт под основу стринга? Или нет?
Далее если я очищу вектор методом clear, у меня получится вектор из 0 элементов и 1500 зарезервированных.
Что тогда будет в этих зарезервированных?
При вызове clear самым оптимальным на мой взгляд былобы - полное освобождание памяти по указателям (удаление стрингов) и обнуление указателей.
Но возможен и такой вариант - все стринги просто вычистятся и количество байт в них станет 0, а зарезервированное место 1500 байт останется, и таким образом clear вообще ни приведет к освобождению памяти ни за счет удаления элементов в векторе, ни за счет удаления самих стрингов.
Подскажите что в действительности будет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2011, 17:29     Vector string'ов и освобождение памяти
Посмотрите здесь:

C++ Освобождение памяти
резервирование памяти/освобождение памяти для трехмерного массива C++
Освобождение памяти C++
с++ Освобождение памяти C++
C++ Освобождение памяти в c++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
01.10.2011, 17:39     Vector string'ов и освобождение памяти #2
http://alenacpp.blogspot.com/2005/06/vector_30.html
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
01.10.2011, 17:43  [ТС]     Vector string'ов и освобождение памяти #3
Пожалуйста, не скидывайте ссылки на маны, я прекрасно понимаю принцип работы вектора и знаю все велосипеды для его очистки. Меня интересует принцип работы связки вектор + стринг при использовании стандартных функций - push_back и clear.
Bers
Заблокирован
01.10.2011, 17:54     Vector string'ов и освобождение памяти #4
Цитата Сообщение от Union Посмотреть сообщение
Пожалуйста, не скидывайте ссылки на маны, я прекрасно понимаю принцип работы вектора и знаю все велосипеды для его очистки. Меня интересует принцип работы связки вектор + стринг при использовании стандартных функций - push_back и clear.
Если бы понимали - этой темы бы не было.

Если метод clear() вектора запускает диструкторы стрингов - значит они полностью освобождают свою память.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
01.10.2011, 18:13  [ТС]     Vector string'ов и освобождение памяти #5
Вектор стрингов это: один массив указателей + множество "массивов чаров", разбрасанных по куче.

Если метод clear() вектора запускает диструкторы стрингов - значит они полностью освобождают свою память.
Венктор не освобождает свою память, я про это написал в первом посте. А интересует меня - освобождается ли память, занимаемая именно стрингами при вызове clear().
А также при создании вектора - создаются ли стринги для зарезервированных элементов.
Bers
Заблокирован
01.10.2011, 18:16     Vector string'ов и освобождение памяти #6
Цитата Сообщение от Union Посмотреть сообщение
Венктор не освобождает свою память, я про это написал в первом посте.
А интересует меня - освобождается ли память, занимаемая стрингами.
А также при создании вектора - создаются ли стринги для зарезервированных элементов.
Создать вектор стрингов, и пронаблюдать, как будут запускаться конструкторы-диструкторы стрингов религия не позволяет?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.10.2011, 18:22     Vector string'ов и освобождение памяти #7
Union, Вектор освобождает свою память при вызове деструктора.
При вызове clear - он удаляет ВСЕ элементы, которые присутствуют - вызывает деструктор этих элементов.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.10.2011, 18:28     Vector string'ов и освобождение памяти #8
Union, что-то я ничего не могу понять... У вас какой-то странный вектор, и стринг тоже странный какой-то. Память они за собой не чистят, вишь ты... А с чего вы взяли, что они память не чистят? Пруф?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.10.2011, 18:29     Vector string'ов и освобождение памяти #9
http://liveworkspace.org/code/bcb846...885d21b0124002
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
02.10.2011, 00:45  [ТС]     Vector string'ов и освобождение памяти #10
silent_1991 они не чистят память. Когда памяти не хватает - она выделяется, но когда элементы удаляются - память не высвобождается. Подробнее можете почитать по ссылке, которую Bers скинул в первом сообщении.
Bers, религия то позволяет, не позволяет ситуация.
Всем спасибо, тема закрыта.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.10.2011, 00:52     Vector string'ов и освобождение памяти #11
Union, они не удаляют выделенную память под массив, но они вызывают деструкторы для всех элементов массива, которые больше не актуальны. Почитайте про аллокаторы, в стандартном аллокаторе как раз процессы выделения памяти и конструирования объекта (и, соответственно, уничтожения объекта и освобождения памяти) происходят раздельно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2011, 01:23     Vector string'ов и освобождение памяти
Еще ссылки по теме:

Освобождение памяти C++
C++ Освобождение памяти
C++ Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
02.10.2011, 01:23     Vector string'ов и освобождение памяти #12
Union, ты имеешь ввиду такой пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <vector>
using std::vector;
 
class test {
public:
   test(void) {
        puts("ALLOCATE");
   }
   ~test() {
        puts("FREE");
   }
};
 
int main(void) { 
   vector<test*> vec;
   vec.push_back(new test());
   vec.push_back(new test());
   vec.push_back(new test());
   vec.push_back(new test());
 
   // вектор чистит свой внутрений массив, деструктор класса-объекта не будет вызван
   // vec.erase(vec.begin(), vec.end());
   // vec.clear();
 
   for(int i = 0; i < vec.size(); i++) 
      delete vec[i];
   vec.clear();
 
   getchar();
   return 0;
}
В этом случае контроль за памятью ложиться и на сторону прогера.
Yandex
Объявления
02.10.2011, 01:23     Vector string'ов и освобождение памяти
Ответ Создать тему
Опции темы

Текущее время: 01:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru