Can the default C++ std::allocator be supplanted/superseded for 3rd party libraries?

Viewed 708

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 malloc and free functions; overridden new, new[], delete and 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 new and delete calls come through the new and delete overrides, but these appear no different to tracking than a call to new or delete made from main.

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/

1 Answers

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?

Not in general; especially for things that you don't have source code for.

Consider (for example) a call to std::allocator<int>::allocate. Chances are, it's marked as inline, which means that the body of the function has been embedded in the object code that you're linking. Providing your own copy of that function at link time (or in a separate dylib) will have no effect.

Providing your own global operator new is probably the best you can do.

Related