Моя команда работает над приложением, в котором нам необходимо отслеживать использование памяти и предоставлять статистику о том, сколько областей памяти используется программой (например, 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/