Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освобождение памяти из-под массива, Как корректнее это сделать? 
:(
    Опции темы
alexr3
Дата 2.4.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



Добрый день!

Я с C++ знаком не очень близко. В основном с Java, но тут пришлось написать программку на C++ для обработки большого объема данных (сотни Гб). В программе встречается довольно много конструкций вида:

Код

SomeClass ** arr = new SomeClass*[size]; // Конструктора SomeClass() нет!
for (int i=0; i < size; i++){
    arr[i] = new SomeClass(x, y, z);
}

...


delete[] arr;


Вот насколько корректно оператор delete[] освободить память? У меня на тестовых объемах данных все работает хорошо. На реальных (больших) - вылетает с ошибкой о нехватке памяти (работает на юниксовом сервере, 64-bit, 16Гб ОЗУ). Но обработка данных ведется построчно и, грубо говоря, в памяти одновременно должно находиться не так уж много данных. Поэтому мне кажется, что где-то утечка памяти идет и от строки к строке объем свободной памяти все уменьшается.

А еще как отработает такая конструкция:
Код

void *buffer = (void *) new char[size];
delete[] (char*)buffer;

?
PM MAIL   Вверх
KelTron
Дата 2.4.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Нужно удалить данные из массива, а потом сам массив ссылок, а у тебя происходит только второе, надо так:
Код

for (int i=0; i < size; i++){
    delete arr[i];
}

delete[] arr;



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
alexr3
Дата 2.4.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



Спасибо за ответ!

Мне почему-то казалось, что оператора 
Код
delete[] 
тем и отличается от 
Код
delete
, что сначала выполнит 
Код
delete 
для каждого своего элемента. Нет?
PM MAIL   Вверх
toxx
Дата 2.4.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



alexr3
еще желательно присвоить указателю 0 
Код

arr=0;


Цитата

delete[] тем и отличается от  delete


Да все верно, только как ты память выделяешь, так ты её и освобождаешь

Это сообщение отредактировал(а) toxx - 2.4.2010, 13:09
PM MAIL   Вверх
KelTron
Дата 2.4.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Цитата(alexr3 @  2.4.2010,  12:58 Найти цитируемый пост)
отличается от 

В данном случае у тебя массив это массив ссылок - переменных, которые указывают на объекты, а не объектов, т.е. при вызове delete[] удалятся именно ссылки, а сами объекты останутся висеть в памяти, поэтому их нужно удалять отдельно.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
bsa
Дата 2.4.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



alexr3, чтобы такой проблемы не было, нужно использовать std::vector<boost::shared_ptr<SomeClass> >. Вместо boost::shared_ptr можно использовать свой умный указатель с подсчетом ссылок.
PM   Вверх
alexr3
Дата 2.4.2010, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



Спасибо за ответы. Про boost где-то уже слышал, попробую разобраться.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.