C++ 可以使用默认的C++;第三方库的分配器是否被取代?
我的团队正在开发一个应用程序,在这个应用程序中,我们需要跟踪内存使用情况,并提供程序内存区域使用量的统计数据(例如,非受控STL容器使用的N字节)。我需要找到一种方法来识别STL容器中第三方LIB中分配的内存 该应用程序使用第三方库,这些库要么我们无法访问源代码,要么我们被指示不要对源代码进行更改。其中一些库使用标准STL容器,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
如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(…)标准所替代。@保罗是的,请参阅第二句。