Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Утечка памяти про работе со строками


Автор: Ibragim 22.1.2007, 17:10
День добрый.
Есть участок кода, выполняется в цикле, который вызывает утечку памяти:

Код

    try
      SiteContent := ht.Get(Url);
    except
      ht.Free;
      State := 'Error';
      Synchronize(ShowState);
      Continue;
    end;
    ht.Free;
    SiteContent := LowerCase(SiteContent);


Как говорит MemProof, не удаляется объект SiteContent, то есть при следующей итерации цикла место из-под прошлого SiteContent не освобождается, а создается новая область в куче.
Как корректно освободить место из-под SiteContent? Пробую DisposeStr(@SiteContent); но функция, как говорит помощь, корректно работает только со строками, созданными NewStr. Да и опыт показал, что так нестабильно.
Как правильно решается такая задача?
Заранее спасибо.

Автор: MetalFan 22.1.2007, 17:15
все супер. в приведенном куске кода никаких ошибок не наблюдается, с чем автора и поздравляю.

Автор: Ibragim 22.1.2007, 17:34
н-да действительно, в "голом" проекте нет утечки...
черт, где же собака порылась...

А можно вот так? 

Код

s := ConLinks(Url, s);


ConLinks - моя функция, s, Url: string;

Автор: ShadeSt 22.1.2007, 17:39
Либо так:
Код

  S := ''

либо так
Код

  Finalize(S);


если я правильно понимаю, то утечка может быть в том случае, если ht.Get() выделяется новый участок памяти под строку.
попробуй так:
Код

      SiteContent := '';
      SiteContent := ht.Get(Url);

Автор: Ibragim 22.1.2007, 17:41
Код

SiteContent := '';
SiteContent := ht.Get(Url);


Так пробовал, не помогает. Сча попробую Finalize

Автор: MetalFan 22.1.2007, 17:42
Цитата(Ibragim @  22.1.2007,  17:34 Найти цитируемый пост)
А можно вот так? 

что вот так?

абсолютно неинформативные сообщения. такое ощущение, что сам с собой автор разговаривает)

Автор: Ibragim 22.1.2007, 17:52
гм, сорри smile 

Не вызовет ли утечку памяти, если в работе со строками сделать следующее.
1. Создать функцию, положим 

Код

function ConLinks(Url: string; s: string);
begin
   s := LeftStr(s,20);
   Result := LeftStr(Url,5) + s;
end;


2. И вызывать эту функцию следующим образом

Код

s := 'test2test2test2test2test2test2test2';
Url := 'test1test1test1test1test1test1test1test1';
s := ConLinks(Url, s);

Автор: aktuba 23.1.2007, 01:37
Я так понимаю, это код из DLL. Ты случаем не передаешь данные из/в программу?

Автор: Stern87 25.2.2008, 03:24
Если я не ошибаюсь, то строки в параметрах надо писать через const.

Автор: MetalFan 25.2.2008, 09:23
Цитата(Stern87 @  25.2.2008,  03:24 Найти цитируемый пост)
Если я не ошибаюсь, то строки в параметрах надо писать через const. 

смотря какая цель преследуется...


Цитата(Ibragim @  22.1.2007,  17:52 Найти цитируемый пост)
Не вызовет ли утечку памяти, если в работе со строками сделать следующее.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)