![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти в 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.
На чем основано сие утверждение?