Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как освободить ресурсы занятые функцией 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, т.к. указатели утеряны...


Наверх

Титульная страница Поиск, карта сайта Написать письмо