![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Ещё раз всех приветствую.
На этапе тестирования софта заметил утечку памяти. И судя по всему проблема в том, что у меня используются длинные строки string(больше 255 символов). Решил переписать всё, оставив только Pchar, но столкнулся с проблемой, обычные функции, котрыми я выполняю поиск подстроки в строке не раотают с типом Pchar В гугле я тоже не нашел решения, да и сам не смог осилить, прошу помочь, необходима функция замены подстроки в строке Pchar. Cпасибо Добавлено @ 07:23 Или может быть проще избавиться от утечки памяти при длинных строках string? Хотя думаю правильнее отказаться от string Это сообщение отредактировал(а) lollollollol - 3.4.2013, 07:23 |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
string без указания количества символов - это либо UnicodeString, либо AnsiString (в зависимости от версии среды). Никаких утечек памяти при использовании этого типа быть не может.
Для замены подстроки в строке обычно используют StringReplace. Да, там используются string. Если тебе уж так очень надо писать без string, то наваяй свою функцию, это же не запрещено.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
В результате каждый раз, когда я запрашиваю страничку, диспетчер показывает увеличение памяти. И только увеличение Это сообщение отредактировал(а) lollollollol - 3.4.2013, 09:08 |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
fastmm подключать пробовали?
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
нет, дже не слшал про это
|
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Подключите, увидите, есть ли утечки, а также поможет найти места, где они появляются. Я бы без fastmm не грешил на string, ни разу не видел чтобы он куда-то утекал.
http://sourceforge.net/projects/fastmm/ -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| lollollollol |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Скачал, подключил, на удивление софт стал в нескоько раз быстрее выполнять основной рабочий код.
Но стабильно кидает Access Violation в модуле FastMM4 на строке
или
Добавлено через 8 минут и 21 секунду А как с его помощью определить место утечки? Прога не должна больше 2-х метров весить, через 5 минут работы уже 50 мегов Это сообщение отредактировал(а) lollollollol - 3.4.2013, 09:40 |
||||
|
|||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Показания диспетчера не значат абсолютно ничего. Утечек и AV с PChar словишь в миллион раз больше, чем со String для которого все выделение и освобождение памяти производится автоматически. А еще если у тебя часто приходится получать длину строки.
http://www.gunsmoker.ru/2010/02/redux.html Добавлено через 4 минуты и 12 секунд
Так для релиза дебажные настройки выруби, у меня вот сейчас выходной экзешник из XE3 с подключенным для full debug FastMM4 весит 21.5 Мб. И какая версия FastMM? Может надо последнюю качнуть? -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Скачал отсюда
http://sourceforge.net/projects/fastmm/ сам ехе 88кб весит, а вот в памяти должен 2 мегобайта занимать. Но каждый раз когда я записыаю длинные строки (цыклом) увеличивается память. И обратно не уменьшается |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
http://forum.vingrad.ru/forum/topic-353769.html
В D2007 FastMM уже встроен Добавлено через 1 минуту и 45 секунд В dpr файле можно добавить строку:
http://delphist.ru/utechki-pamyati-v-delphi/ |
||||
|
|||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Akella, извиняюсь за то что тема немного не соответствует названию, и за то что указал не полную информацию.
Я использую делфи7. По поводу утечки, к сожалению прямо сейчас уже нет времени работать, но вечером обязательно воспользую ссылой. Спасибо! Добавлено через 2 минуты и 59 секунд [Error] hidden.dpr(809): Undeclared identifier: 'ReportMemoryLeaksOnShutdown' Это откуда? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Всё же я бы использовал eurekalog или madExcept
|
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
buff это просто string, как уже говорилось ранее.
Переменная формируется примерно таким образом:
Это сообщение отредактировал(а) lollollollol - 3.4.2013, 17:00 |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Если buff и подобные ей переменные глобальные и очищаются только после завершения программы, то нет ничего удивительного в увеличении используемой памяти. string тут вообще не при чем.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
buff не глобальная переменная. Но для записи в неё, я передаю указатель.
Обновил прошлое сообщение. Может быть проблема в том что я так записываю в функции: string(result^):=string(result^)+code; Это сообщение отредактировал(а) lollollollol - 3.4.2013, 17:03 |
|||
|
||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Что за кака?
Это сообщение отредактировал(а) Чучмек - 3.4.2013, 17:13 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Извиняюсь, думал что нельзя так указатели использовать.
А пример подобного кода(как у меня) я вычитал на каком-то форуме. Это сообщение отредактировал(а) lollollollol - 3.4.2013, 17:10 |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Не правильно передаешь строки. Строка имеет внутренний счетчик ссылок. Менеджер памяти освобождает выделенную под строку память, когда счетчик ссылок равен нулю.
Добавлено @ 17:14 Моя невнимательность. var S:string; Это сообщение отредактировал(а) Чучмек - 3.4.2013, 17:15 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Исправил, всё по прежнему
|
|||
|
||||
| Beltar |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Никаких пойнтеров к стрингам, если ТОЧНО не знаешь, что делаешь. Вообще срочно читать учебник для начинающих. Что мешает по-русски написать?
А лучше
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
||||||
|
|||||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
А чем лучше? Добавлено через 7 минут и 20 секунд А еще подобные конструкции есть. lollollollol, Поставь перед end;
Должно выводить единицу. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| lollollollol |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
От подобных уонструкций избавился, сделал как ты показал. результат
-2054110216 Забыл добавить, код выполняется в потоке, то есть я на каждый запрос браузера выделаю поток.
И уже в потоке работаю с перменной buff:string; Делал так:
Это сообщение отредактировал(а) lollollollol - 3.4.2013, 18:07 |
||||
|
|||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Тем, что если один возвращаемый параметр, то через функцию банально лучше воспринимается, хотя процедурка тут побыстрее должна быть.
А поток по завершении совершит самоубийство? Если нет, то все, утечка раз дескриптор потерян. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Beltar, даже если так не делать, ничего не меняет, проверил. и утечка таже, и -2054110216
|
|||
|
||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Ты вызываешь ф-ию WinAPI, ее утечки дельфовым менеджером памяти не отловить. Можно MemProof по пробовать.
По алгоритму отладчик в помощь, но сначала переписать все без указателей. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Это нормально. Это из за Здесь не должно быть больше 1. Твоя проблема в потоках. ExitThread не возвращает управление. Соответственно не выполняется код, который добавляет делфа для освобождения строк, по завершении функции. Добавлено @ 18:38 Закоментируй строку , и проверь Добавлено @ 18:44 Сделай так:
Это сообщение отредактировал(а) Чучмек - 3.4.2013, 18:45 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Чучмек, спасибо!!!
Закоментировал строку
и утечка пропала. память возвращает в норму, прям до байтика! Вот уж не думал что проблема в этом... Огромное спасибо! Добавлено через 9 минут и 58 секунд Интересует вопрос. Всё ли корректно с потоком, если не вызывать ExitThread(0);, и не повредит ли закрытие хендла сразу после создания потока? Не смог найти статью, но читал что такое действие спасает от утечки при завершении потока. Это сообщение отредактировал(а) lollollollol - 3.4.2013, 18:57 |
|||
|
||||
| Чучмек |
|
||||||||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Во первых решается. Во вторых - корректно.
Функция ThreadProc
Не повредит.
Функция CreateThread -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||||||||
|
|||||||||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Я сразу так сделал, как увидел Ваше сообщение. Но остался вопрос, получается если сделать так как вы показали, и сразу закрыть хендл, как это сделано у меня, то можно не бепокоиться о том, что объект потока может быть не закрыт? Я знаю что в системе есть ограничение на потоки для одного процесса. И если буду висеть примерно 2000 объектов потоков, то новые потоки созданы не будут. P.S. Думаю тему будет разумно переименовать в Утечка памяти, String, Потоки или что нибудь подобное, чтобы люди могли найти решение Это сообщение отредактировал(а) lollollollol - 3.4.2013, 20:53 |
|||
|
||||
![]()
|
| Правила форума "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. |