Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Как освободить ресурсы занятые функцией StringToOleStr?   Найти похожие ветки 

 
Sour Smile   (2005-02-21 10:53) [0]

Диспетчер задач, показывает увеличение занимаемой виртуальной памяти приложением на 84 Мб, при каждом нажатии кнопки с таким обработчиком:
procedure TForm1.Button1Click(Sender: TObject);
var
 pw: PWChar;
 i: Integer;
begin
 for i := 0 to 1000000 do pw := StringToOleStr("qwertyuiopasdfghjklzxcvbnm");
end;


Ясно, что нужно реcурсы после использования освобождать... но как?
В хэлпе об этом ни слова не написано, FreeMem генерирует ошибку...


 
Johnmen ©   (2005-02-21 11:22) [1]

Забавно... И куда, как ты предполагаешь, будет указывать pw при окончании цикла, и куда денутся результаты его работы ?
:)))
Вобщем, освободить не сможешь 999999, т.к. указатели утеряны...


 
Sour Smile   (2005-02-21 11:35) [2]

Я это прекрасно понимаю - имелось ввиду какой функцией/процедурой следует освобождать занятые ресурсы. Другими словами: какая функция/процедура пропущена в цикле, которая вернёт занятые ресурсы. Или другими словами: какая функция/процедура скрывается под словом Освободить в нижеследущем коде:

procedure TForm1.Button2Click(Sender: TObject);
var
 pw: PWChar;
 i: Integer;
begin
 for i := 0 to 1000000 do
 begin
   pw := StringToOleStr("qwertyuiopasdfghjklzxcvbnm");
   /// Используем pw
   Освободить(pw);
 end;
end;


 
Набережных С. ©   (2005-02-21 11:45) [3]

SysFreeString. В ActiveX и Ole2 она объявлена с параметром PWideChar. Можно использовать и объявление в System, но придется приводить типы.


 
Sour Smile   (2005-02-21 11:54) [4]


> Набережных С. ©   (21.02.05 11:45) [3]

Огромное спасибо - это действительно "она" :)
Кстати в инете полно примеров использующих функцию StringToOleStr, но не освобождающих за ней ресурсы... Для меня же очень критично, если в моих приложениях имеются "утечки памяти".


 
Johnmen ©   (2005-02-21 12:08) [5]

>Sour Smile   (21.02.05 11:54) [4]
>Кстати в инете полно примеров использующих функцию
>StringToOleStr, но не освобождающих за ней ресурсы...

Это, видимо, потому, что они освободятся менеджером при завершении работы приложения.


 
Sour Smile   (2005-02-21 12:54) [6]


> Johnmen ©   (21.02.05 12:08) [5]


> Это, видимо, потому, что они освободятся менеджером при
> завершении работы приложения.

??? Дык, ИМХО, при завершении работы приложения все занятые им ресурсы освобождаются.
Важно же не чтобы при завершении приложения освобождались ресурсы, а когда в них больше нет необходимости - иначе при безостановочной (автономной) работе приложения, неминуемы "утечки памяти", что чревато понятно чем...


 
Набережных С. ©   (2005-02-21 13:12) [7]


> Johnmen ©   (21.02.05 12:08) [5]

Тогда, видимо, и FreeMem не нужна? А зачем, если при закрытии приложение все и так освободится?


> Sour Smile   (21.02.05 12:54)

Лучше, по возможности, использовать WideString, а не PWideChar. И преобразование компилятор производит автоматически, и память сам освобождает.


 
Johnmen ©   (2005-02-21 13:17) [8]

>Набережных С. ©   (21.02.05 13:12) [7]

Так он хочет по мере работы освобождать. В этом случае твой ответ верен...


 
Набережных С. ©   (2005-02-21 13:42) [9]


> Johnmen ©   (21.02.05 13:17) [8]

Видимо, я тебя просто не правильно понял:(


 
Sour Smile   (2005-02-22 13:27) [10]


> Набережных С. ©   (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-22 13:46) [11]


> Sour Smile   (22.02.05 13:27) [10]


> У меня (D6) эта функия объявлена только в секции implementation...
> :(

В D7 так-же. Писал по памяти, помню что она там есть, а вот где объявлена - забыл:)



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.06 c
1-1108563511
TeNY
2005-02-16 17:18
2005.03.06
как зная Pointer загрузить строку?


3-1107333036
Oleg_
2005-02-02 11:30
2005.03.06
case ... when в запросе выдает ошибку


3-1107766195
Меджид
2005-02-07 11:49
2005.03.06
Как записать содержимое BLOB поля в Буфер (Clipboard)


14-1108204746
leonidus
2005-02-12 13:39
2005.03.06
Тестирование качалки сайтов


14-1108634154
juice
2005-02-17 12:55
2005.03.06
Прокси со стороны сервера