17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
|
|
1 | |
Освобождение памяти, занятой вектором07.09.2011, 14:30. Показов 6254. Ответов 62
Метки нет (Все метки)
У меня задача требует чтобы у вектора было в резерве не более 100 элементов. При постоянном росте вектора понятно как это обеспечить, а вот как быть при уменьшении количества элементов? Я не в курсе последних стандартов, подскажите есть ли сейчас способы гарантированного освобождения памяти, занятой вектором, и вообще какие способы существуют?
0
|
07.09.2011, 14:30 | |
Ответы с готовыми решениями:
62
Освобождение неиспользуемой вектором памяти Резервирование памяти/освобождение памяти для трехмерного массива Освобождение памяти Освобождение памяти |
Заблокирован
|
|||||||||||
07.09.2011, 19:44 | 21 | ||||||||||
- какие обекты? Преобразовали тип и делов ноль
структуры пожалусто
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
07.09.2011, 19:49 | 22 |
-=ЮрА=-, при malloc не вызывается конструктор (вызывать можно через placement new), при free не вызывается деструктор (можно правда напрямую вызвать ->~Type())
это как бэ не сильно удобно, да и вообще IDiscRecorder есть структура, элементы которой указатели на функции, те пример мало для объектов пригоден
0
|
07.09.2011, 19:50 | 23 | |||||
-=ЮрА=-, запустите этот код:
Добавлено через 19 секунд Не по теме: Опоздал...
0
|
Заблокирован
|
|
07.09.2011, 19:55 | 24 |
http://msdn.microsoft.com/en-u... .85).aspx;)
С таким же успехом преобразуюю CListCtrl * pList = (CListrCtrl *)malloc(sizeof(CListCtrl)); alex_x_x, вы работали с imapi v1?У меня даже вышло подключить IDiscMasterProgressEvents (хотя это был огромооомный гемор - в нете кучи топиков что интерфейс не работает) и сделать полнофункциональный бёрнер, так что с имапи знаком не по наслышке...
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|||||||||||
07.09.2011, 20:01 | 25 | ||||||||||
-=ЮрА=-, я знаком с COM
для ++ интерфейс реализован как таблица виртуальных функций (v-table), но с си он имеет бинарную совместимость, так как фактически является структурой указателей на функции в коме есть нечто вроде
вы объявляете интерфейс
0
|
Заблокирован
|
||||||
07.09.2011, 20:13 | 26 | |||||
talis
Вот код и скрин работы, предлагаю скомпилировать
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
07.09.2011, 20:17 | 28 |
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
07.09.2011, 20:20 | 29 | |||||
-=ЮрА=-, во-первых это подмена понятий, во-вторых
выдает сразу Segmentation fault, потому что состояние non-POD членов оказывается неопределенным (так как для них тоже конструкторы не вызываются) при их ручной инициализации в InitMSG с исползованием operator=(*) их поведение не становится определенней
0
|
07.09.2011, 20:23 | 30 | |||||
-=ЮрА=-, вы вообще знаете, зачем нужны конструкторы и деструкторы? Вы понимаете, что конструктор вашего класса не вызывается? Проверьте:
0
|
Заблокирован
|
||||||
07.09.2011, 20:33 | 31 | |||||
- Так полегчает???
- неа я из каменного века, но как вариант предлагаю это скомпилировать
0
|
07.09.2011, 20:44 | 33 | |||||
-=ЮрА=-, а если после этого нужно изменить количество SimpleClass'ов? realloc? а как же деструкторы в случае уменьшения количества экземпляров или конструкторы в случае увеличения?
Добавлено через 5 минут Так вот не проще:
0
|
Заблокирован
|
||||||
07.09.2011, 22:13 | 34 | |||||
Вот доработал свой наглядный пример
0
|
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
|
|
07.09.2011, 22:33 [ТС] | 35 |
Насколько мне было известно, ранее swap трюк не гарантировал освобождение памяти. В стандарте не было прописано что при этом должно выделиться меньше памяти под новый вектор. Теперь это не так?
Насчет того, что многие уверены что память вообще не нужно освобождать, в моём проекте, в тз отдельным пунктом идёт ограничение памяти под сервак 512 мегабайт. При этом нагрузка не прописана, будет работать на мощном сервере, с быстрой памятью и процом и поэтому частота переаллокаций не имеет никакого значения. А сервак - что-то типо логера, он собрал одни данные, скинул их в базу, и далее данные надо частично затереть, т.к. параллельно в разное время начинают собираться отдельные массивы, каждый около 100 мегабайт. Если не чистить, то все 10 массивов разрастутся до 1 гб, а если чистить, то вполне можно уложиться в отведенный объем озу. Т.ч. такие задачи существуют.
0
|
07.09.2011, 22:35 | 36 |
можно узнать что за среда? подозреваю, что realloc и malloc просто перебиты чем-то. Linux, gcc совершенно другое поведение. То есть память выделяется но конструкторы, как и положено, не вызываются.
а не, понял. не скопировал присваивание.
0
|
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
|
|
07.09.2011, 22:39 [ТС] | 37 |
Linux, но вектор, всмысле stl - кроссплатформенный, поэтому задал вопрос в данном разделе
0
|
08.09.2011, 00:58 | 38 | |||||
Union, вот мои эксперименты:
add 5 add 70 add 100 memstat size del 170 memstat size add 40 add 20 memstat У меня (gcc 4.6) вектор выделяет память при расширении. При уменьшении количества элементов он вызывает деструкторы (кстати, обходя void destroy( pointer )), но память не отдаёт. После уничтожения самого объекта вектора (введите quit) он отдаст память, но там уже поздновато будет.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
08.09.2011, 10:54 | 40 |
вы вызываете конструктор анонимного объекта, а потом присваивание и это печально
правильно в вашем примере будет так и только так как у talis, с использованием placement new
0
|
08.09.2011, 10:54 | |
08.09.2011, 10:54 | |
Помогаю со студенческими работами здесь
40
Освобождение памяти Освобождение памяти Освобождение памяти Освобождение памяти Освобождение памяти с++ Освобождение памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |