我的团队正在开发一个应用程序,我们需要跟踪内存使用情况,并提供有关程序使用多少内存区域的统计信息(例如,不受控制的STL容器使用了N个字节)。我需要找到一种方法来从STL容器中识别在第三方库中分配的内存。
该应用程序利用了第三方库,这些第三方库要么我们无权访问源代码,要么被指示不要对源代码进行更改。其中一些库使用标准STL容器like std::vector<int>
,但是它们使用了(或在封闭库的情况下似乎使用了)默认的std::allocator
。我们的目标是Windows,并计划在Mac和Linux平台上使用C++ 17进行进一步的开发。
我已经重写了malloc
和free
函数;重写的new
,new[]
,delete
和delete[]
运算符;并创建了一个从STLAllocator
派生的std::allocator
类,用作我们使用STL容器的_Alloc
模板参数。对于提供钩子(Hook)来替换内存分配器的库,我已经这样做了。当其余第三个部分库中的STL容器使用默认的std::allocator
时,我可以看到它们的new
和delete
调用是通过new
和delete
替代实现的,但是它们看起来与跟踪对new
或从delete
进行的main
的调用没有什么不同。
我已经阅读了许多有关如何声明和使用自己的std::allocator
类的精彩描述,让我们想起了提供不同分配器时模板参数相等的问题,并且意识到即将使用std::experimental::pmr::polymorphic_allocator
解决方案,但是我没有找到明确的答案我的问题。有没有办法代替不提供钩子(Hook)来覆盖STL容器使用的默认std::allocator
的第三方库的默认std::allocator
?
对于任何感兴趣的人,这里是描述模板参数相等性问题的链接;总的来说,它也是std::allocator的一个很好的概述:
https://blog.feabhas.com/2019/03/thanks-for-the-memory-allocator/
最佳答案
不一般;特别是对于您没有源代码的东西。
考虑(例如)调用std::allocator<int>::allocate
。很有可能,它被标记为inline
,这意味着该函数的主体已嵌入在您要链接的目标代码中。在链接时(或在单独的dylib中)提供该函数的副本将无效。
提供自己的全局operator new
可能是您所能做的最好的事情。