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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
#1

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

01.10.2011, 17:29. Просмотров 3088. Ответов 11
Метки нет (Все метки)

Как известно вектор не освобождает память.
В подавляющем большинстве случаев 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++):

Правильное освобождение памяти при std::vector - C++
vector<Worker*> workers; workers.push_back(new Worker("Jack", 1000)) Как теперь правильно освободить память? Как я понял у...

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

с++ Освобождение памяти - C++
Здравствуйте, объявляю в классе: А ** а; Далее выделяю память в функции: а=0; a = new A*; for(uint i=0;i<5;++i) { a =...

Освобождение памяти - C++
Есть класс, в котором я выделяю память с помощью new. В деструкторе класса я с помощью delete освобождаю память, но у меня вылетает ошибка...

Освобождение памяти - C++
Как сделать, чтобы при вызове деструктора экземпляра i класса image, вызвался и деструктор класса image_bmp? class image { public:...

Освобождение памяти - C++
Собственно есть простенький класс class Human { public: Human ( ); void ptintHuman(); private: static long...

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

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

Если метод clear() вектора запускает диструкторы стрингов - значит они полностью освобождают свою память.
Венктор не освобождает свою память, я про это написал в первом посте. А интересует меня - освобождается ли память, занимаемая именно стрингами при вызове clear().
А также при создании вектора - создаются ли стринги для зарезервированных элементов.
Bers
Заблокирован
01.10.2011, 18:16 #6
Цитата Сообщение от Union Посмотреть сообщение
Венктор не освобождает свою память, я про это написал в первом посте.
А интересует меня - освобождается ли память, занимаемая стрингами.
А также при создании вектора - создаются ли стринги для зарезервированных элементов.
Создать вектор стрингов, и пронаблюдать, как будут запускаться конструкторы-диструкторы стрингов религия не позволяет?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.10.2011, 18:22 #7
Union, Вектор освобождает свою память при вызове деструктора.
При вызове clear - он удаляет ВСЕ элементы, которые присутствуют - вызывает деструктор этих элементов.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.10.2011, 18:28 #8
Union, что-то я ничего не могу понять... У вас какой-то странный вектор, и стринг тоже странный какой-то. Память они за собой не чистят, вишь ты... А с чего вы взяли, что они память не чистят? Пруф?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.10.2011, 18:29 #9
http://liveworkspace.org/code/bcb846...885d21b0124002
Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
02.10.2011, 00:45  [ТС] #10
silent_1991 они не чистят память. Когда памяти не хватает - она выделяется, но когда элементы удаляются - память не высвобождается. Подробнее можете почитать по ссылке, которую Bers скинул в первом сообщении.
Bers, религия то позволяет, не позволяет ситуация.
Всем спасибо, тема закрыта.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.10.2011, 00:52 #11
Union, они не удаляют выделенную память под массив, но они вызывают деструкторы для всех элементов массива, которые больше не актуальны. Почитайте про аллокаторы, в стандартном аллокаторе как раз процессы выделения памяти и конструирования объекта (и, соответственно, уничтожения объекта и освобождения памяти) происходят раздельно.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
02.10.2011, 01:23 #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;
}
В этом случае контроль за памятью ложиться и на сторону прогера.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2011, 01:23
Привет! Вот еще темы с ответами:

Освобождение памяти - C++
Добрый день. Подскажите пожалуйста, почему возникает ошибка при уничтожение массива class MyClass { public: int *data; int...

Освобождение памяти в c++ - C++
Привет, помогите разобраться с освобождением памяти в c++. Я так понимаю, что если освободить память, то переменная удаляется, но почему же...

Освобождение памяти - C++
Товарищи,недавно баловался в Microsoft VS,готовился к экзаменам,писал небольшие програмки с использованием динамических массивов.Память под...

Освобождение памяти - C++
Есть многопоточное приложение. Создается глобальная структура: Пример из msdn. typedef struct _MyData { int val1; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.10.2011, 01:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru