C++ 可以使用默认的C++;第三方库的分配器是否被取代?

C++ 可以使用默认的C++;第三方库的分配器是否被取代?,c++,c++11,memory-management,stl,c++17,C++,C++11,Memory Management,Stl,C++17,我的团队正在开发一个应用程序,在这个应用程序中,我们需要跟踪内存使用情况,并提供程序内存区域使用量的统计数据(例如,非受控STL容器使用的N字节)。我需要找到一种方法来识别STL容器中第三方LIB中分配的内存 该应用程序使用第三方库,这些库要么我们无法访问源代码,要么我们被指示不要对源代码进行更改。其中一些库使用标准STL容器,如std::vector,但它们使用了默认的std::allocator。我们的目标是Windows,未来的工作计划是针对Mac和Linux平台,尽可能多地使用C++17

我的团队正在开发一个应用程序,在这个应用程序中,我们需要跟踪内存使用情况,并提供程序内存区域使用量的统计数据(例如,非受控STL容器使用的N字节)。我需要找到一种方法来识别STL容器中第三方LIB中分配的内存

该应用程序使用第三方库,这些库要么我们无法访问源代码,要么我们被指示不要对源代码进行更改。其中一些库使用标准STL容器,
如std::vector
,但它们使用了默认的
std::allocator
。我们的目标是Windows,未来的工作计划是针对Mac和Linux平台,尽可能多地使用C++17

我已经覆盖了
malloc
free
函数;重写
new
new[]
delete
delete[]
运算符;并创建了一个派生自
std::allocator
stldocator
类,该类用作我们使用STL容器的
\u Alloc
模板参数。对于提供钩子来替换内存分配器的库,我已经这样做了。当剩余的第三个部分lib中的STL容器使用默认的
std::allocator
时,我可以看到它们的
new
delete
调用通过
new
delete
覆盖,但是这些与从
main
调用
new
delete
跟踪没有什么不同

我已经阅读了许多关于如何声明和使用自己的
std::allocator
类的精彩描述,在提供不同的分配器时,我被提醒了模板参数相等问题,并了解了即将使用
std::experimental::pmr::polymopic_allocator
的解决方案,但我还没有找到我的问题的确切答案。对于不提供钩子覆盖STL容器使用的默认
std::分配器的第三方LIB,是否有办法取代默认的
std::分配器

对任何感兴趣的人来说,下面是描述模板参数相等问题的链接;这也是对std::allocator的一个很好的概述:

对于不提供钩子覆盖STL容器使用的默认std::分配器的第三方LIB,是否有办法替换默认std::分配器

不一般;特别是对于那些你没有源代码的东西

考虑(例如)调用
std::allocator::allocate
。很可能,它被标记为
inline
,这意味着函数体已经嵌入到您链接的目标代码中。在链接时(或在单独的动态库中)提供该函数的您自己的副本将无效


提供您自己的全局
operator new
可能是最好的选择。

您可以修改主应用程序中的所有
new
表达式,以使用
operator new
的自定义重载,并以这种方式将其与库代码区分开来,如果这是一种可接受的解决方案。不幸的是,这更像是一种通用跟踪,不应该对每个类都施加重载new和delete。@胡桃,啊,对不起,我误解了你的意思。是的,如上所述,我已经重载了
new
new[]
delete
delete[]
。这个解决方案的问题是,
std::alllocator
调用了
new
,这是通过重载的
new
实现的,没有办法区分它们进行标记。@walnut是的,我已经完成了这两项工作。e、 g.
运算符新建(std::size\u t)
运算符新建(std::size\u t,const char*libID,const char*file,uint32\u t行)
。是的,我可以扩展它以包含另一个标签。但我最初的问题是,我需要区分来自库的STL容器分配。因此,这可以将主应用程序与其他库分离,但不能分离出哪些库正在进行分配。好的,最后一部分回答了我原来的问题。在这种情况下,我认为除了检查
operator new
中的调用堆栈以确定调用的来源之外,没有任何可靠的解决方案;但我想我会问一下,以防我遗漏了什么。至少在VS17的情况下,他们似乎没有将其标记为内联:````````` NODISCARD`` DECLSPEC``分配器`` Ty*分配(`` CRT` GUARDOVERFLOW const size` t` Count){//分配` Count元素的数组返回(静态`强制转换(``分配(`获取`大小` of n(`计数)))}默认情况下,类主体中定义的`Paul函数是
内联的
,这也不重要,因为
std::allocator
是一个类模板,如果
std::allocator
专门化没有显式专门化,那么它会导致与
inline
基本相同的问题。@Paul我说的是
inline
说明符。函数是否内联始终取决于编译器,与
内联
无关,但如果函数是
内联
或模板专用化,则函数的目标代码保证存在于库中。在任何情况下,@MarshallCrow指出的问题是相关函数可能是内联的,因此您无法更改它们的行为<代码> new new < /COD>和 MalOC是特殊的,因为它们分别被C++和POSIX(…)标准所替代。@保罗是的,请参阅第二句。