c++ - 可以为 3rd 方库取代/取代默认 C++ std::allocator 吗?

标签 c++ c++11 memory-management stl c++17

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

该应用程序使用了我们无法访问源代码或已被指示不要对源代码进行更改的 3rd 方库。其中一些库使用标准 STL 容器,like std::vector<int> ,但他们已经使用(或似乎使用,在封闭库的情况下)默认 std::allocator .我们的目标是 Windows, future 计划在 Mac 和 Linux 平台上工作,尽可能使用 C++17。

我已经覆盖了 mallocfree职能;已覆盖 new , new[] , deletedelete[]运营商;并创建了 STLAllocator派生自 std::allocator 的类用作_Alloc用于我们使用 STL 容器的模板参数。对于提供钩子(Hook)来替换内存分配器的库,我已经这样做了。当其余 3rd 部分库中的 STL 容器使用默认 std::allocator ,我可以看到他们的newdelete电话来自 newdelete覆盖,但这些似乎与跟踪没有什么不同,而不是对 new 的调用或 deletemain 制成.

我已经阅读了很多关于如何声明和使用您自己的 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/

相关文章:

c++ - 带有 boost::asio 的 TCP 服务器,线程池的可扩展性与无堆栈协程

c++ - 为什么 valarray 没有像 C++03 中的 vector 那样的交换函数?

C++11 访问具有限定名称的无作用域枚举数

c++ - 双重调用传递到 std::vector::emplace_back 的类的复制构造函数

C++:不删除对象/总是/内存泄漏吗?

objective-c - 我应该释放 cStringUsingEncoding 返回的字符串吗?

c++ - 如何在 OpenCV 中找到 x 和 y 梯度?

c++ - 在 C++ 中,是否有一种最佳方式来运行指向该值的指针链?

c++ - 将现有的 shared_ptr 附加到 shared_ptr 的 vector

c - 使用 JSON-C 的内存泄漏