My team is working on an application, where we need to track memory usage, and provide statistics on how much memory areas of the program utilize (e.g. N bytes used by uncontrolled STL containers). I need to find a way to identify memory allocated in 3rd party libs from STL containers.
The application makes use of 3rd party libraries that either we don't have access to the source code, or have been directed not to make changes to the source. Some of these libraries use standard STL containers,
like std::vector<int>, but they have used (or appear to use, in the case of the closed libs) the default
std::allocator. We are targeting Windows, with future work planned for Mac and Linux platforms, using C++17 as much as possible.
I've overridden the
free functions; overridden
delete operators; and created an
STLAllocator class derived from
std::allocator that is used as the
_Alloc template parameter for our use of STL containers. For the libraries that provide hooks to replace the memory allocators, I have done so. When the STL containers in the remaining 3rd partly libs use the default
std::allocator, I can see their
delete calls come through the
delete overrides, but these appear no different to tracking than a call to
delete made from
I've read many great descriptions of how to declare and use your own
std::allocator class, been reminded of the template parameter equality issue when providing different allocators, and made aware of an upcoming solution using
std::experimental::pmr::polymorphic_allocator, but I haven't found a definitive answer to my question. Is there a way to supplant the default
std::allocator for 3rd party libs that don't provide a hook to override the default
std::allocator used by STL containers?
For anyone interested, here is the link that describes the template parameter equality issue; it's also a good overview of std::allocator in general: https://blog.feabhas.com/2019/03/thanks-for-the-memory-allocator/