Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Pchar Замена подстроки в строке 
:(
    Опции темы
lollollollol
Дата 3.4.2013, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ещё раз всех приветствую.

На этапе тестирования софта заметил утечку памяти. 
И судя по всему проблема в том, что у меня используются длинные строки string(больше 255 символов).

Решил переписать всё, оставив только Pchar, но столкнулся с проблемой, обычные функции, котрыми я выполняю поиск подстроки в строке не раотают с типом Pchar

В гугле я тоже не нашел решения, да и сам не смог осилить, прошу помочь, необходима функция замены подстроки в строке Pchar.

Cпасибо

Добавлено @ 07:23
Или может быть проще избавиться от утечки памяти при длинных строках string? Хотя думаю правильнее отказаться от string

Это сообщение отредактировал(а) lollollollol - 3.4.2013, 07:23
PM MAIL   Вверх
Poseidon
Дата 3.4.2013, 08:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



string без указания количества символов - это либо UnicodeString, либо AnsiString (в зависимости от версии среды). Никаких утечек памяти при использовании этого типа быть не может.

Для замены подстроки в строке обычно используют StringReplace. Да, там используются string. Если тебе уж так очень надо писать без string, то наваяй свою функцию, это же не запрещено.

Цитата(lollollollol @  3.4.2013,  07:12 Найти цитируемый пост)
Или может быть проще избавиться от утечки памяти при длинных строках string? Хотя думаю правильнее отказаться от string
Я постоянно пользуюсь string и утечек по этому поводу не наблюдаю. Не знаю откуда у тебя сложилось такое ошибочное мнение, что из-за string происходят утечки.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
lollollollol
Дата 3.4.2013, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    if (pos(' /style.css',str_buff)<>0) then begin
      buff:='HTTP/1.1 200 OK'+#13#10+'Server: Apache/2'+#13#10+'X-Powered-By: PHP/5.2.17'+#13#10+'Vary: Accept-Encoding,User-Agent'+#13#10+'Content-Length: 3000'+#13#10+'Keep-Alive: timeout=1, max=100'+#13#10+'Connection: Keep-Alive'+#13#10+'Content-Type: text/css'+#13#10+#13#10;
      buff:=buff+'body  {margin: 0 auto; padding: 0;  width: 100%; height: 100%; background: #f5f5f5 repeat;} body, td {font:11px Verdana,Arial,Helvetica, sans-serif; color:#555;} img {border: none;} a:link, a:visited  {color:#2C68A6;}';
//тут идёт дальше формирование css кода, примерно 1000 символов в сумме
      send(recvsock,buff[1],length(buff),0);
    end;


В результате каждый раз, когда я запрашиваю страничку, диспетчер показывает увеличение памяти. И только увеличение

Это сообщение отредактировал(а) lollollollol - 3.4.2013, 09:08
PM MAIL   Вверх
Illusion Dolphin
Дата 3.4.2013, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



fastmm подключать пробовали?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
lollollollol
Дата 3.4.2013, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нет, дже не слшал про это
PM MAIL   Вверх
Illusion Dolphin
Дата 3.4.2013, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Подключите, увидите, есть ли утечки, а также поможет найти места, где они появляются. Я бы без fastmm не грешил на string, ни разу не видел чтобы он куда-то утекал.
http://sourceforge.net/projects/fastmm/ 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
lollollollol
Дата 3.4.2013, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Скачал, подключил, на удивление софт стал в нескоько раз быстрее выполнять основной рабочий код.
Но стабильно кидает Access Violation в модуле FastMM4 на строке
Код

  {Unlock the block type}
  mov TSmallBlockType[ebx].BlockTypeLocked, al

или
Код

  {Get the new first free block}
  and ecx, [eax - 4]


Добавлено через 8 минут и 21 секунду
А как с его помощью определить место утечки?
Прога не должна больше 2-х метров весить, через 5 минут работы уже 50 мегов

Это сообщение отредактировал(а) lollollollol - 3.4.2013, 09:40
PM MAIL   Вверх
Beltar
Дата 3.4.2013, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Показания диспетчера не значат абсолютно ничего. Утечек и AV с PChar словишь в миллион раз больше, чем со String для которого все выделение и освобождение памяти производится автоматически. А еще если у тебя часто приходится получать длину строки.  smile Не вижу никаких оснований использовать эту мерзость, кроме как для преобразования типов при вызове API-функций.
http://www.gunsmoker.ru/2010/02/redux.html

Добавлено через 4 минуты и 12 секунд
Цитата

Прога не должна больше 2-х метров весить, через 5 минут работы уже 50 мегов


Так для релиза дебажные настройки выруби, у меня вот сейчас выходной экзешник из XE3 с подключенным для full debug FastMM4 весит 21.5 Мб. smile Релизный вариант меньше 3 (Юникодовые версии компактностью экзешек не отличаются).

И какая версия FastMM? Может надо последнюю качнуть?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Скачал отсюда
http://sourceforge.net/projects/fastmm/

сам ехе 88кб весит, а вот в памяти должен 2 мегобайта занимать. Но каждый раз когда я записыаю длинные строки (цыклом) увеличивается память.

И обратно не уменьшается
PM MAIL   Вверх
Akella
Дата 3.4.2013, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



http://forum.vingrad.ru/forum/topic-353769.html
Цитата
Например, многие не утруждают себя указать версии библиотек, компонент, версию IDE, ОС.


В D2007 FastMM уже встроен

Добавлено через 1 минуту и 45 секунд
В dpr файле можно добавить строку:
Код
ReportMemoryLeaksOnShutdown := DebugHook <> 0;


http://delphist.ru/utechki-pamyati-v-delphi/
PM MAIL   Вверх
lollollollol
Дата 3.4.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akella, извиняюсь за то что тема немного не соответствует названию, и за то что указал не полную информацию.

Я использую делфи7.

По поводу утечки, к сожалению прямо сейчас уже нет времени работать, но вечером обязательно воспользую ссылой.

Спасибо!

Добавлено через 2 минуты и 59 секунд
[Error] hidden.dpr(809): Undeclared identifier: 'ReportMemoryLeaksOnShutdown'

Это откуда?
PM MAIL   Вверх
Akella
Дата 3.4.2013, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Всё же я бы использовал eurekalog или madExcept
PM MAIL   Вверх
Poseidon
Дата 3.4.2013, 15:22 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(lollollollol @  3.4.2013,  09:06 Найти цитируемый пост)
В результате каждый раз, когда я запрашиваю страничку, диспетчер показывает увеличение памяти. И только увеличение
Хотелось бы выяснить границы видимости переменной buff. Не удивлюсь, если увеличение памяти происходит из-за неочистки этих переменный после отработки.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
lollollollol
Дата 3.4.2013, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



buff это просто string, как уже говорилось ранее.
Переменная формируется примерно таким образом:

Код

procedure xxxxxxxxxxxxx(Result:Pointer);
   while (Условие) do begin
      string(result^):=string(result^)+code;
   end;
end;


xxxxxxxxxxxxx(@buff);
send(recvsock,buff[1],length(buff),0);




Это сообщение отредактировал(а) lollollollol - 3.4.2013, 17:00
PM MAIL   Вверх
Poseidon
Дата 3.4.2013, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(Poseidon @  3.4.2013,  15:22 Найти цитируемый пост)
Хотелось бы выяснить границы видимости переменной buff.
Если buff и подобные ей переменные глобальные и очищаются только после завершения программы, то нет ничего удивительного в увеличении используемой памяти. string тут вообще не при чем.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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