COM-класс Возвращающий байт [] в .NET - освобождать память или нет - PullRequest
1 голос
/ 21 июня 2010

У меня есть COM-компонент, имеющий класс MyDataObject. Есть метод со следующей подписью:

HRESULT MyDataObject::GetData(long Format, VARIANT* retval)

Этот COM-объект используется в приложении .NET, и метод возвращает строку или байтовый массив в зависимости от значения формата. Возвращенное значение преобразуется в байт [] в .NET и используется.

Я подозреваю, что у этого метода есть утечка памяти, т. Е. Массив байтов, возвращаемый этим методом, должен быть как-то освобожден. Когда я отлаживаю приложение, я вижу вызов метода GetData (...), занимающий память при каждом вызове. Я не уверен, как освободить эту память. Могу ли я изменить ее на hGlobal, а затем вызвать ReleaseHGlobal (...) или есть другой способ?

ОБНОВЛЕНО


Да, я использую диспетчер задач, чтобы увидеть, сколько памяти используется образцом приложения. Когда я запускаю приложение, оно остается на 16 МБ, но как только я нажимаю кнопку тестирования, чтобы вызвать этот метод GetData (...) примерно в 850 раз, память начинает увеличиваться, и TaskManager показывает использование памяти приложением, увеличенное примерно на 25 МБ.

1 Ответ

1 голос
/ 21 июня 2010

Уровень взаимодействия COM в CLR уже освобождает вариант после копирования его значения в объект.Даже если вы захотите вызвать Marshal.FreeCoTaskMem (), вы не сможете, вы не сможете получить ссылку на оригинальный вариант.

Вы не сказали, как пришли к выводу, что у вас утечка памяти.Не используйте Taskmgr.exe, это создаст неправильное впечатление.Убедитесь, что у вас есть настоящая утечка, вызвав этот метод миллионы раз в небольшой тестовой программе.Если использование памяти не растет без ограничений и в конечном итоге вызывает OOM, то у вас нет реальной утечки.Если это действительно происходит сбой, то заподозрить COM-сервер в утечке.Как выделение как строки, так и массива, но возвращение только одного из них.

...