![]() |
|
Модераторы: bsa |
![]()
|
|
| alexr3 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
Добрый день!
Я с C++ знаком не очень близко. В основном с Java, но тут пришлось написать программку на C++ для обработки большого объема данных (сотни Гб). В программе встречается довольно много конструкций вида:
Вот насколько корректно оператор delete[] освободить память? У меня на тестовых объемах данных все работает хорошо. На реальных (больших) - вылетает с ошибкой о нехватке памяти (работает на юниксовом сервере, 64-bit, 16Гб ОЗУ). Но обработка данных ведется построчно и, грубо говоря, в памяти одновременно должно находиться не так уж много данных. Поэтому мне кажется, что где-то утечка памяти идет и от строки к строке объем свободной памяти все уменьшается. А еще как отработает такая конструкция:
? |
||||
|
|||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Нужно удалить данные из массива, а потом сам массив ссылок, а у тебя происходит только второе, надо так:
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| alexr3 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
Спасибо за ответ!
Мне почему-то казалось, что оператора
|
||||||
|
|||||||
| toxx |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
alexr3
еще желательно присвоить указателю 0
Да все верно, только как ты память выделяешь, так ты её и освобождаешь Это сообщение отредактировал(а) toxx - 2.4.2010, 13:09 |
||||
|
|||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
В данном случае у тебя массив это массив ссылок - переменных, которые указывают на объекты, а не объектов, т.е. при вызове delete[] удалятся именно ссылки, а сами объекты останутся висеть в памяти, поэтому их нужно удалять отдельно. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
alexr3, чтобы такой проблемы не было, нужно использовать std::vector<boost::shared_ptr<SomeClass> >. Вместо boost::shared_ptr можно использовать свой умный указатель с подсчетом ссылок.
|
|||
|
||||
| alexr3 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
Спасибо за ответы. Про boost где-то уже слышал, попробую разобраться.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |