![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как освободить ресурсы занятые функцией StringToOleStr? [D6, Win2k]
Sour Smile © (2005-02-21 10:53:00)Диспетчер задач, показывает увеличение занимаемой виртуальной памяти приложением на 84 Мб, при каждом нажатии кнопки с таким обработчиком:
procedureTForm1.Button1Click(Sender: TObject);
var
pw: PWChar;
i: Integer;
begin
fori := 0 to1000000 dopw := StringToOleStr('qwertyuiopasdfghjklzxcvbnm');
end;
Ясно, что нужно реcурсы после использования освобождать... но как?
В хэлпе об этом ни слова не написано, FreeMem генерирует ошибку...
Набережных С. (2005-02-22 13:46:00) [1]
> Sour Smile (22.02.05 13:27) [10]
> У меня (D6) эта функия объявлена только в секции implementation...
> :(
В D7 так-же. Писал по памяти, помню что она там есть, а вот где объявлена - забыл:)
Sour Smile (2005-02-22 13:27:00) [2]
> Набережных С. © (21.02.05 13:12) [7]
> > Sour Smile (21.02.05 12:54)
>
> Лучше, по возможности, использовать WideString, а не PWideChar.
> И преобразование компилятор производит автоматически, и
> память сам освобождает.
Друг! И здесь ты абсолютно прав! :)
Я наконец выкроил время, чтобы разобраться с WideString (правда не без помощи CPU - очень удобная штука для понимания внутренних процессов приложения). Преимущества при использовании WideString "на лицо". :)
> Набережных С. © (21.02.05 11:45) [3]
> SysFreeString. В ActiveX и Ole2 она объявлена с параметром
> PWideChar. Можно использовать и объявление в System, но
> придется приводить типы.
А вот к этой функции из модуля System я добраться не смог... У меня (D6) эта функия объявлена только в секцииimplementation... :(
Впрочем она мне уже не нужна - сейчас использую WideString. :)
Набережных С. (2005-02-21 13:42:00) [3]
> Johnmen © (21.02.05 13:17) [8]
Видимо, я тебя просто не правильно понял:(
Johnmen (2005-02-21 13:17:00) [4]>Набережных С. © (21.02.05 13:12) [7]
Так он хочет по мере работы освобождать. В этом случае твой ответ верен...
Набережных С. (2005-02-21 13:12:00) [5]
> Johnmen © (21.02.05 12:08) [5]
Тогда, видимо, и FreeMem не нужна? А зачем, если при закрытии приложение все и так освободится?
> Sour Smile (21.02.05 12:54)
Лучше, по возможности, использовать WideString, а не PWideChar. И преобразование компилятор производит автоматически, и память сам освобождает.
Sour Smile (2005-02-21 12:54:00) [6]
> Johnmen © (21.02.05 12:08) [5]
> Это, видимо, потому, что они освободятся менеджером при
> завершении работы приложения.
??? Дык, ИМХО, при завершении работы приложения все занятые им ресурсы освобождаются.
Важно же не чтобы при завершении приложения освобождались ресурсы, а когда в них больше нет необходимости - иначе при безостановочной (автономной) работе приложения, неминуемы "утечки памяти", что чревато понятно чем...
Johnmen (2005-02-21 12:08:00) [7]>Sour Smile (21.02.05 11:54) [4]
>Кстати в инете полно примеров использующих функцию
>StringToOleStr, но не освобождающих за ней ресурсы...
Это, видимо, потому, что они освободятся менеджером при завершении работы приложения.
Sour Smile (2005-02-21 11:54:00) [8]
> Набережных С. © (21.02.05 11:45) [3]
Огромное спасибо - это действительно "она" :)
Кстати в инете полно примеров использующих функцию StringToOleStr, но не освобождающих за ней ресурсы... Для меня же очень критично, если в моих приложениях имеются "утечки памяти".
Набережных С. (2005-02-21 11:45:00) [9]SysFreeString. В ActiveX и Ole2 она объявлена с параметром PWideChar. Можно использовать и объявление в System, но придется приводить типы.
Sour Smile (2005-02-21 11:35:00) [10]Я это прекрасно понимаю - имелось ввиду какой функцией/процедурой следует освобождать занятые ресурсы. Другими словами: какая функция/процедура пропущена в цикле, которая вернёт занятые ресурсы. Или другими словами: какая функция/процедура скрывается под словом Освободить в нижеследущем коде:
procedureTForm1.Button2Click(Sender: TObject);
var
pw: PWChar;
i: Integer;
begin
fori := 0 to1000000 do
begin
pw := StringToOleStr('qwertyuiopasdfghjklzxcvbnm');
/// Используем pw
Освободить (pw);
end;
end;
Johnmen (2005-02-21 11:22:00) [11]Забавно... И куда, как ты предполагаешь, будет указывать pw при окончании цикла, и куда денутся результаты его работы ?
:)))
Вобщем, освободить не сможешь 999999, т.к. указатели утеряны...