| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Pchar Замена подстроки в строке |
| Автор: lollollollol 3.4.2013, 07:12 |
| Ещё раз всех приветствую. На этапе тестирования софта заметил утечку памяти. И судя по всему проблема в том, что у меня используются длинные строки string(больше 255 символов). Решил переписать всё, оставив только Pchar, но столкнулся с проблемой, обычные функции, котрыми я выполняю поиск подстроки в строке не раотают с типом Pchar В гугле я тоже не нашел решения, да и сам не смог осилить, прошу помочь, необходима функция замены подстроки в строке Pchar. Cпасибо Добавлено @ 07:23 Или может быть проще избавиться от утечки памяти при длинных строках string? Хотя думаю правильнее отказаться от string |
| Автор: lollollollol 3.4.2013, 09:06 | ||
В результате каждый раз, когда я запрашиваю страничку, диспетчер показывает увеличение памяти. И только увеличение |
| Автор: Illusion Dolphin 3.4.2013, 09:27 |
| fastmm подключать пробовали? |
| Автор: lollollollol 3.4.2013, 09:32 |
| нет, дже не слшал про это |
| Автор: Illusion Dolphin 3.4.2013, 09:36 |
| Подключите, увидите, есть ли утечки, а также поможет найти места, где они появляются. Я бы без fastmm не грешил на string, ни разу не видел чтобы он куда-то утекал. http://sourceforge.net/projects/fastmm/ |
| Автор: lollollollol 3.4.2013, 09:38 | ||||
| Скачал, подключил, на удивление софт стал в нескоько раз быстрее выполнять основной рабочий код. Но стабильно кидает Access Violation в модуле FastMM4 на строке
или
Добавлено через 8 минут и 21 секунду А как с его помощью определить место утечки? Прога не должна больше 2-х метров весить, через 5 минут работы уже 50 мегов |
| Автор: Beltar 3.4.2013, 09:52 | ||
| Показания диспетчера не значат абсолютно ничего. Утечек и AV с PChar словишь в миллион раз больше, чем со String для которого все выделение и освобождение памяти производится автоматически. А еще если у тебя часто приходится получать длину строки. http://www.gunsmoker.ru/2010/02/redux.html Добавлено через 4 минуты и 12 секунд
Так для релиза дебажные настройки выруби, у меня вот сейчас выходной экзешник из XE3 с подключенным для full debug FastMM4 весит 21.5 Мб. И какая версия FastMM? Может надо последнюю качнуть? |
| Автор: lollollollol 3.4.2013, 09:59 |
| Скачал отсюда http://sourceforge.net/projects/fastmm/ сам ехе 88кб весит, а вот в памяти должен 2 мегобайта занимать. Но каждый раз когда я записыаю длинные строки (цыклом) увеличивается память. И обратно не уменьшается |
| Автор: Akella 3.4.2013, 10:19 | ||||
http://forum.vingrad.ru/forum/topic-353769.html
В D2007 FastMM уже встроен Добавлено через 1 минуту и 45 секунд В dpr файле можно добавить строку:
http://delphist.ru/utechki-pamyati-v-delphi/ |
| Автор: lollollollol 3.4.2013, 10:28 |
| Akella, извиняюсь за то что тема немного не соответствует названию, и за то что указал не полную информацию. Я использую делфи7. По поводу утечки, к сожалению прямо сейчас уже нет времени работать, но вечером обязательно воспользую ссылой. Спасибо! Добавлено через 2 минуты и 59 секунд [Error] hidden.dpr(809): Undeclared identifier: 'ReportMemoryLeaksOnShutdown' Это откуда? |
| Автор: Akella 3.4.2013, 10:32 |
| Всё же я бы использовал eurekalog или madExcept |
| Автор: Poseidon 3.4.2013, 15:22 | ||
|
| Автор: lollollollol 3.4.2013, 16:56 | ||
| buff это просто string, как уже говорилось ранее. Переменная формируется примерно таким образом:
|
| Автор: Poseidon 3.4.2013, 16:59 |
| Если buff и подобные ей переменные глобальные и очищаются только после завершения программы, то нет ничего удивительного в увеличении используемой памяти. string тут вообще не при чем. |
| Автор: lollollollol 3.4.2013, 17:02 |
| buff не глобальная переменная. Но для записи в неё, я передаю указатель. Обновил прошлое сообщение. Может быть проблема в том что я так записываю в функции: string(result^):=string(result^)+code; |
| Автор: Чучмек 3.4.2013, 17:05 | ||||
Что за кака?
|
| Автор: lollollollol 3.4.2013, 17:09 |
| Извиняюсь, думал что нельзя так указатели использовать. А пример подобного кода(как у меня) я вычитал на каком-то форуме. |
| Автор: Чучмек 3.4.2013, 17:12 |
| Не правильно передаешь строки. Строка имеет внутренний счетчик ссылок. Менеджер памяти освобождает выделенную под строку память, когда счетчик ссылок равен нулю. Добавлено @ 17:14 Моя невнимательность. var S:string; |
| Автор: lollollollol 3.4.2013, 17:27 |
| Исправил, всё по прежнему |
| Автор: Beltar 3.4.2013, 17:34 | ||||||
Никаких пойнтеров к стрингам, если ТОЧНО не знаешь, что делаешь. Вообще срочно читать учебник для начинающих. Что мешает по-русски написать?
А лучше
|
| Автор: Чучмек 3.4.2013, 17:42 | ||
А чем лучше? Добавлено через 7 минут и 20 секунд А еще подобные конструкции есть. lollollollol, Поставь перед end;
Должно выводить единицу. |
| Автор: lollollollol 3.4.2013, 17:56 | ||||
| От подобных уонструкций избавился, сделал как ты показал. результат -2054110216 Забыл добавить, код выполняется в потоке, то есть я на каждый запрос браузера выделаю поток.
И уже в потоке работаю с перменной buff:string; Делал так:
|
| Автор: Beltar 3.4.2013, 18:12 | ||
Тем, что если один возвращаемый параметр, то через функцию банально лучше воспринимается, хотя процедурка тут побыстрее должна быть.
А поток по завершении совершит самоубийство? Если нет, то все, утечка раз дескриптор потерян. |
| Автор: lollollollol 3.4.2013, 18:19 |
| Beltar, даже если так не делать, ничего не меняет, проверил. и утечка таже, и -2054110216 |
| Автор: Beltar 3.4.2013, 18:33 |
| Ты вызываешь ф-ию WinAPI, ее утечки дельфовым менеджером памяти не отловить. Можно MemProof по пробовать. По алгоритму отладчик в помощь, но сначала переписать все без указателей. |
| Автор: Чучмек 3.4.2013, 18:36 | ||
Это нормально. Это из за Здесь не должно быть больше 1. Твоя проблема в потоках. ExitThread не возвращает управление. Соответственно не выполняется код, который добавляет делфа для освобождения строк, по завершении функции. Добавлено @ 18:38 Закоментируй строку , и проверь Добавлено @ 18:44 Сделай так:
|
| Автор: lollollollol 3.4.2013, 18:57 | ||
| Чучмек, спасибо!!! Закоментировал строку
и утечка пропала. память возвращает в норму, прям до байтика! Вот уж не думал что проблема в этом... Огромное спасибо! Добавлено через 9 минут и 58 секунд Интересует вопрос. Всё ли корректно с потоком, если не вызывать ExitThread(0);, и не повредит ли закрытие хендла сразу после создания потока? Не смог найти статью, но читал что такое действие спасает от утечки при завершении потока. |
| Автор: Чучмек 3.4.2013, 20:25 | ||||||||||
Во первых решается. Во вторых - корректно.
http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_threadproc.htm
Не повредит.
http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_createthread.htm |
| Автор: lollollollol 3.4.2013, 20:50 | ||
Я сразу так сделал, как увидел Ваше сообщение. Но остался вопрос, получается если сделать так как вы показали, и сразу закрыть хендл, как это сделано у меня, то можно не бепокоиться о том, что объект потока может быть не закрыт? Я знаю что в системе есть ограничение на потоки для одного процесса. И если буду висеть примерно 2000 объектов потоков, то новые потоки созданы не будут. P.S. Думаю тему будет разумно переименовать в Утечка памяти, String, Потоки или что нибудь подобное, чтобы люди могли найти решение |