Вопрос или проблема
Мы используем SDK Purview C++ для чтения и применения меток чувствительности к файлам.
Мы наблюдаем утечку памяти при вызове операций с файлами Purview. Мы протестировали последние версии SDK 1.14 и 1.15 с одинаковыми результатами.
Похоже, что память, занимаемая при получении дескриптора файла, никогда не освобождается, даже несмотря на то, что операция с файлом завершена. Дескриптор файла является общим указателем, которым нам не следует управлять самостоятельно, и в SDK нет функции, позволяющей принудительно освободить этот дескриптор.
Мы можем предоставить очень простой пример, который демонстрирует проблему. Большая часть кода была взята из примера, предоставленного вместе со SDK.
Если вы хотите получить этот пример проекта, пожалуйста, дайте мне знать. Архив примерно 35 Мб, и вам понадобятся установленные соответствующие инструменты для сборки (либо Linux, либо Windows) и приложение Azure с соответствующими разрешениями Purview.
Заранее спасибо за помощь, которую вы можете мне оказать!
С уважением.
Ответ или решение
Проблема утечки памяти при использовании SDK Purview C++ (версии 1.14 и 1.15), особенно при чтении меток из файла, может быть сложной и требующей глубокого изучения, особенно учитывая специфику управления памятью в C++. В этом ответе разберем детали вашей ситуации и предложим возможные пути решения.
Фон
Использование SDK Purview для работы с чувствительными данными является важной задачей для обеспечения безопасности. Тем не менее, утечка памяти — это серьезная проблема, которая может привести к деградации производительности системы и сбоям в работе приложений. Вы упоминаете, что утечка происходит при получении дескриптора файла, который реализован как shared_ptr.
Проблема
Из вашего описания вытекает, что память, связанная с дескрипторами файлов, не освобождается корректно после выполнения операций. Это может происходить по ряду причин:
-
Управление жизненным циклом объектов: Если shared_ptr используется в библиотеке SDK, он должен управляться библиотекой, но, похоже, этот процесс работает некорректно. Возможно, в SDK есть утечка в процессе создания или уничтожения объектов.
-
Нет возможности принудительного освобождения: Отсутствие API для явного освобождения ресурсов может ограничивать возможности разработчика в управлении использованием памяти.
Предложения по решению
Вот несколько рекомендаций, которые могут помочь вам устранить утечку памяти:
-
Профилирование памяти: Используйте инструменты профилирования памяти, такие как Valgrind (для Linux) или Visual Studio Profiler (для Windows), чтобы точно определить, где происходит утечка. Это даст понимание о том, какие объекты остаются в памяти.
-
Обращение в службу поддержки: Поскольку вы уже провели тесты на версиях 1.14 и 1.15, рассмотрите возможность обращения в службу технической поддержки Microsoft или сообщество Azure для получения советов и информации о известных проблемах.
-
Тестовый проект: Вы упомянули о готовом примере проекта, который демонстрирует проблему. Обязательно поделитесь им с соответствующими специалистами, так как детальный анализ кода может выявить специфические проблемы в вашем случае.
-
Контроль использования shared_ptr: Рассмотрите возможность создания обертки вокруг shared_ptr в вашем коде. Это может помочь более детально отслеживать создание и уничтожение объектов:
class FileHandleWrapper { private: std::shared_ptr<FileHandle> handle; public: FileHandleWrapper(std::shared_ptr<FileHandle> h) : handle(h) {} // Далее добавьте методы для работы с handle, включая деструктор, который будет отслеживать освобождение памяти };
-
Обновления SDK: Убедитесь, что у вас установлена последняя версия SDK. Иногда разработчики исправляют ошибки, связанные с утечками памяти, в более ранних версиях библиотеки.
-
Документация и изменения: Ознакомьтесь с документацией SDK, чтобы убедиться, что вы используете методы правильно. Также обратите внимание на журналы изменений между версиями для выявления известных проблем.
Заключение
Утечки памяти могут вызвать серьезные проблемы в приложениях, используя SDK, такое как Purview C++. При работе с библиотеками, которые управляют памятью, важно внимательно следить за ресурсами и использовать полезные инструменты для выявления и устранения проблем. Обратите внимание на рекомендованные шаги и не стесняйтесь обращаться за поддержкой. Это может существенно упростить процесс решения проблемы.
Если у вас возникнут дополнительные вопросы или потребуется помощь в анализе кода, пожалуйста, дайте знать. Мы всегда готовы помочь.