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

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

Утечка памяти в CAPICOM. Как бороться?


Василий_М ©   (2004-10-29 10:11:00) 

Господа, есть проблема с утечrой памяти в CAPICOM. При вызове EnvelopedData.Encrypt не освобождается память от предыдущего вызова EnvelopedData.Encrypt.
В чем проблема, может кто сталкивался?

Ниже приведен код:

var EnvelopedData : IEnvelopedData;
begin
  EnvelopedData := CreateOleObject('CAPICOM.EnvelopedData') as IEnvelopedData;

  // тут заглядываем в хранилище и назначаем сертификат для EnvelopedData
  // ....... пропускаем ....
  // назначили сертификаты

  // шифрование
  for i := 0 to 1000 do
    begin
      EnvelopedData.Content := 'большая строка(на пару тысяч байтов)';
      Result := EnvelopedData.Encrypt(CAPICOM_ENCODE_ANY); // тут подскакивает память
      // в предыдущей строке подскакивает память(то нормально)
      // но при следующем проходе цикла - предудущие затраты памяти должны,
      // казалось бы, освободиться
      // но не освобождаются и все, и при каждом проходе - копятся
    end;

  EnvelopedData := nil; // самое обидное - накопленная память не освобождается даже здесь

end;


Василий_М   (2004-10-29 13:24:00) [1]

2 Reindeer Moss Eater
Это еще не признак утечки памяти.
Если последовательный многократный вызов приводит в итоге к съеданию всей памяти - это утечка.


Я специально продемонстрировал цикл для того чтобы показать "последовательный многократный вызов". Как раз при нем и имеет место быть "утечка".
Хорошо, спасибо и на этом, постараюсь разобраться в чем нем дело.


Reindeer Moss Eater   (2004-10-29 13:00:00) [2]

При вызове EnvelopedData.Encrypt не освобождается память от предыдущего вызова EnvelopedData.Encrypt.

Это еще не признак утечки памяти.
Если последовательный многократный вызов приводит в итоге к съеданию всей памяти - это утечка.

А если диспетчер что то там показал после предыдущего вызова - это еще ничего не значит.


Reindeer Moss Eater   (2004-10-29 12:55:00) [3]

тебе же сказали в [4]


Василий_М   (2004-10-29 12:49:00) [4]

Хотелось бы выснить у тех, кто реализовывал подобную задачу - только у меня такое наблюдается или это уже было кем-то подмечено? Или я что-то упускаю?


Reindeer Moss Eater   (2004-10-29 11:43:00) [5]

Дык используй тогда прямо CryptoAPI


Василий_М   (2004-10-29 11:39:00) [6]

2 Reindeer Moss Eater

:), шутка хорошая, но тем не менее мне не на много легче.

Как я уже сказал, шифруются большие объемы. Поэтому, память съедается очень быстро со всеми вытекающими отсюда последствиями.
Просто хотелось бы выснить у тех, кто реализовывал подобную задачу - только у меня такое наблюдается или это уже было кем-то подмечено? Или я что-то упускаю?


Romkin   (2004-10-29 11:31:00) [7]

Винда сама думает, отдавать-не отдавать. Профайлером смотри :)


Reindeer Moss Eater   (2004-10-29 11:27:00) [8]

"Если на клетке с тигром написано ...."
В общем не верь глазам своим.


Василий_М   (2004-10-29 11:26:00) [9]

>> На чем основано ...

Смотрю в диспетчере задач расход памяти процессом.  Строки довольно большого размера, поэтому скачок бросается в глаза.


Amoeba   (2004-10-29 11:17:00) [10]


> не освобождается память от предыдущего вызова EnvelopedData.Encrypt.

На чем основано сие утверждение?


Наверх

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