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