我的团队正在开发一个应用程序,我们需要跟踪内存使用情况,并提供有关程序使用多少内存区域的统计信息(例如,不受控制的STL容器使用了N个字节)。我需要找到一种方法来从STL容器中识别在第三方库中分配的内存。

该应用程序利用了第三方库,这些第三方库要么我们无权访问源代码,要么被指示不要对源代码进行更改。其中一些库使用标准STL容器like std::vector<int>,但是它们使用了(或在封闭库的情况下似乎使用了)默认的std::allocator。我们的目标是Windows,并计划在Mac和Linux平台上使用C++ 17进行进一步的开发。

我已经重写了mallocfree函数;重写的newnew[]deletedelete[]运算符;并创建了一个从STLAllocator派生的std::allocator类,用作我们使用STL容器的_Alloc模板参数。对于提供钩子(Hook)来替换内存分配器的库,我已经这样做了。当其余第三个部分库中的STL容器使用默认的std::allocator时,我可以看到它们的newdelete调用是通过newdelete替代实现的,但是它们看起来与跟踪对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可能是您所能做的最好的事情。

10-08 04:04