Можно ли заменить / заменить стандартный C ++ std :: allocator для сторонних библиотек? - PullRequest
2 голосов
/ 11 апреля 2020

Моя команда работает над приложением, в котором нам необходимо отслеживать использование памяти и предоставлять статистику о том, сколько областей памяти используется программой (например, N байтов, используемых неконтролируемыми контейнерами STL). Мне нужно найти способ идентифицировать память, выделенную в сторонних библиотеках из контейнеров STL.

Приложение использует сторонние библиотеки, которые либо не имеют доступа к исходному коду, либо были направлены не внести изменения в источник. Некоторые из этих библиотек используют стандартные контейнеры STL like std::vector<int>, но они используют (или, по-видимому, используют в случае закрытых библиотек) значение по умолчанию std::allocator. Мы нацелены на Windows, с будущей работой, запланированной для платформ Ma c и Linux, максимально используя C ++ 17.

Я переопределил malloc и free функции; переопределены операторы new, new[], delete и delete[]; и создал класс STLAllocator, полученный из std::allocator, который используется в качестве параметра шаблона _Alloc для нашего использования контейнеров STL. Для библиотек, которые предоставляют хуки для замены распределителей памяти, я сделал это. Когда контейнеры STL в оставшихся 3-х библиотеках частично используют значение по умолчанию std::allocator, я вижу, что их вызовы new и delete проходят через переопределения new и delete, но они не отличаются от отслеживания, чем вызов new или delete из main.

Я прочитал много замечательных описаний того, как объявлять и использовать свой собственный класс std::allocator, напомнив о проблеме равенства параметров шаблона, когда предоставил различные средства распределения и узнал о готовящемся решении с использованием std::experimental::pmr::polymorphic_allocator, но я не нашел однозначного ответа на свой вопрос. Есть ли способ заменить std::allocator по умолчанию для сторонних библиотек, которые не предоставляют перехват для переопределения std::allocator по умолчанию, используемого контейнерами STL?

Для всех, кто заинтересован, вот ссылка, которая описывает проблема равенства параметров шаблона; это также хороший обзор std :: allocator в целом: https://blog.feabhas.com/2019/03/thanks-for-the-memory-allocator/

1 Ответ

3 голосов
/ 11 апреля 2020

Есть ли способ заменить стандартный std :: allocator для сторонних библиотек, которые не предоставляют перехват для переопределения стандартного std :: allocator, используемого контейнерами STL?

Не в целом; особенно для вещей, для которых у вас нет исходного кода.

Рассмотрим (например) вызов std::allocator<int>::allocate. Скорее всего, он помечен как inline, что означает, что тело функции было встроено в объектный код, который вы связываете. Предоставление собственной копии этой функции во время компоновки (или в отдельном dylib) не будет иметь никакого эффекта.

Предоставление вашей собственной глобальной operator new, вероятно, лучшее, что вы можете сделать.

...