C # / C ++ - утечка памяти - PullRequest
       3

C # / C ++ - утечка памяти

1 голос
/ 28 марта 2011

У меня есть C ++ DLL ( нет исходного кода / .pdb для C ++ DLL ) в производстве.Он вызывается приложением C # с использованием механизма P / Invoke.Теперь есть утечка в C ++ DLL.И после выполнения 20-22 раза приложение вылетает каждый раз.Теперь, как я могу изящно справиться с этим, чтобы я продолжал использовать C ++ DLL с утечкой из C # App?

Ответы [ 4 ]

3 голосов
/ 28 марта 2011

Для меня, если абсолютно невозможно изменить / заменить dll c ++, и вы уверены, что в слое PInvoke проблем нет, единственный вариант, если производительность остается приемлемой, это изолировать вызов dll в исполняемом файле, связывающийся с основным с помощью некоторого IPC (например, Remoting), чтобы вы могли принудительно перезапустить процесс хостинга. Этот подход будет работать, только если способ, которым вы вызываете dll c ++, не слишком гранулирован. Чтобы сделать это с наименьшими усилиями, можно создать веб-службу , на которой размещен вызов C ++ (если вызов C ++ в качестве веб-службы возможен всегда с точки зрения производительности), разместить его в специальном appdomain и укажите для него получение на основе объема памяти. Если это невозможно, решение, предложенное SeeSharp в его комментарии ниже, вероятно, является лучшим.

0 голосов
/ 28 марта 2011
  • Возможно, вы захотите изолировать ваши вызовы этой функции в пользовательском AppDomain. Время от времени выгружайте / обновляйте AppDomain (или, возможно, каждый раз). Неуправляемые библиотеки DLL не выгружаются с доменами приложений
  • Вы можете заключить вашу библиотеку в компонент COM вне процесса ( пример здесь ). Затем вы можете выпустить / воссоздать этот компонент по желанию.
  • Вы также можете работать в месте, где они не выбрасывают свой исходный код ...
0 голосов
/ 28 марта 2011

Запуск кода C ++ в отдельном процессе, чтобы, когда утечка памяти накапливалась до неприемлемого уровня, вы могли перезапустить ее, не затрагивая остальную часть вашего приложения.

0 голосов
/ 28 марта 2011

Не видя взаимодействия, я бы предположил, что C ++ возвращает структуру / класс, который вы должны освободить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...