![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Siton |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Программа работает в круглосуточном режиме.
Возникает утечка памяти при работе с компонентом TStrings при добавлении объекта к строке. Где то я вычитал что делфи сам не очищет объекты добавленные таким способом. При вызове метода TStrings.Clear - память не очищается, я проверял с помощью memproof и DMM. При добавлении кода
возникает ошибка обращения к памяти. Помогите мне пожалуйста. Код программы чужой. Может быть нужно сделать переменную slPr - глобальной. Привожу пример кода:
|
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Интересно как же вам удалось создать экземпляр класса TStrings, учитывая что он абстрактный. Если утечка и возникает, то только по вине наследника, TStrings, который не правельно работает с памятю. Сам же TStrings c ней непосредственно не работает. Ищите главного виновника, - кто скрывается под личиной TStrings - кто у нас сегодня самое слабое звено -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Переменная slPr берется из другой процедуры где имеет тип TStringList
Вот код :
|
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Да но ведь StringList не содержит объектов, только строки, поэтому и пытается обратится к несуществующему объекту Добавлено @ 17:48 Ух ты я и не знал, что туда можно еще и объекты пихать, такое ощущение, что они не присваивались. Добавлено @ 17:52 Я проверил
Все работает нормально! просто один из объектов не существует уже. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| Wing |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Попробуй все таки переименовать все TString на TStringList.
Сделай проверку
Посмотри как работает FreeAndNil:
Возможно нужно также поступить в твоем случае. |
||||
|
|||||
| Mechanic |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
Solve code for lines 14..17 of 2nd code in post #1
Добавлено @ 19:54 Опа, уже повтор. Лапы не шибко быстро сгинаются. --------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Никогда в коде программы не используйте TStrings, это абстрактный класс, нужно использовать TStringList! |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Проверка (Assigned(slPr.Objects[i])) не помогает, все равно ошибка обращения. При использовании FreeAndNil компилятор пишет Constant object cannot be passed as var parameter. В чем ошибка.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
А если так
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Ошибка обращения (AV) на строке o := slPr.Objects[i];
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Siton, У вас проблемы не с освобождением, а с самим объектом - где-то раньше.
Я проверял почти весь код который приводился (из того что компилировался) работает. Вероятно имеюстся проблемы с объектами - напимер если использовались потоки, или в результате ошибки портится содержимое объекта. Похоже, что при вызове деструктора объекта возникает ошибка. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Согласен с
Akella, используй строку описания функции
Если ошибок в другом месте нет , значит код запустится сразу -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Mechanic |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
Создавать такой экземпляр не надо, но вот как тип параметра - почему же не использовать? Мало-ли что понанаследуется, а строки есть строки.
Вот здесь идет адресная арифметика, а результат идет в объектный указатель. Может быть тут и пишется неверный указатель? --------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
||||||
|
|||||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Mechanic, из исходников
куда объект в последней функции записыватся будет????? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Переменная slPr обявляется не глобально. Может быть ее обявить как глобальную?
И еще, можноли передать в функцию не переменную а указатель? |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Можно , но имхо и так все объекты передаются только указателями в дельфи -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Объект добовляется к строке, что бы потом сделать сортировку. Строка хранит номер файла, а объект хранит уровень приоритета. С помощью метода TStringList.CustomSort(CompareObjVal); и функции CompareObjVal сортируются номера файлов. После чего файлы обрабатываются в отсортированном виде.
Может быть есть возможность реализовать данный алгоритм по другому - без использования TStringList и AddObjects. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
где это хранится? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Добавлено @ 13:01 Вычитание адресов объектов это круто! -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Номер найденного файла хранится в slPr.Strings[i], а его приоритет обработки в slPr.Objects[i]. Зачем такая сортировка я еще неразобрался, но после сортировки меняется порядок slPr.Strings[i] и соответственно порядок обработки файлов. Но проблема в очистке.
Добавлено @ 13:20 Есть такое предположение что у одного из найденных файлов приоритет равен нулю и при добавлении к номеру этого файла объекта указывающего на ноль то происходит утечка.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Елки палки в адрес записали значение переменной, значит нет никакого объекта вообще! Вместо удаления - обращение к черт знает какому фрагменту памяти! Удалять ничего в этом случае не надо!
Добавлено @ 13:35 Поэтому и вычитались адреса, поскольку это не адреса вовсе! А просто значения записанные вместо адресса в переменную типа Pointer -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Но потеря памяти остается. если закаментировать строку slPr.AddObject(IntToStr(iR),Pointer(iPr)); то утечка прекращается. Почему же тогда происходит утечка памяти
|
|||
|
||||
| Alexeis |
|
||||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
TStringList - это на самом деле не список а динамический масив
, память , которого выделяется "if FCount = FCapacity then Grow;" порциями. Обычно, то что уже было выделено, не возвращается в кучу, поскольку велика вероятность повторного использования этого пространства. Добавлено @ 16:52 Вот как выглядит grow
Добавлено @ 16:54 А при удалении память не возвращается (не fremem ни чего подобного не наблюдается)
Добавлено @ 16:56 Так, что для освобождения памяти в вашем случае годится только slPr.free; -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||||
|
|||||||||
| Mechanic |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
Ясно куда?
Тут что-ли? Так ясно, что реально работают виртуальные методы наследников. Просто ХЗ, что будет унаследовано и передано, лучше уж в функу пущай базовый класс передается, раз ничего, кроме его методов там не используется. А арифметика в "адресах" Objects[] мне сразу не понравилась.. --------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
||||||
|
|||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
И совсем не ХЗ - а будут вызываться одноименные функции, того класса, который был передан, правда только в том случае если в классе предка они определены были хотя бы абстрактно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Siton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 17.7.2006 Репутация: нет Всего: нет |
Я решил вопрос с утечкой.
Яубрал эту строчку FSR:=aFSR[J]; А везде где встречается FSR заменил на aFSR[J]. И утечка исчезла. Спасибо всем за советы. |
|||
|
||||
| Mechanic |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 5.5.2006 Где: Kharkov, Ukraine Репутация: 6 Всего: 7 |
Имелось в виду, что неизвестно, что именно будет унаследовано от базового класса, и экземпляр какого именно типа будет передаваться на обработку. Вот поэтому всегда стараюсь принимать функами / процедурами минимально приемлемый класс. А с методами пущай уже сам экземпляр разбирается, зачем же ему VMT тогда? Никому же не придет в голову писать, например, потоковый обработчик, на входе который получает TFileStream вместо TStream, если к файлам обработчик никакого отношения не имеет? --------------------
Tell me the extensions of the files You backup and I'll tell You who You are.. ©Mch |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |