如何通过STL库跟踪内存分配

2024-01-08

我想跟踪所有 STL 容器(如映射、列表、向量等)分配的所有内存(由 std lib 分配的大小)。我只想跟踪 STL 容器而不是常规对象创建。基本上想要覆盖 std lib 的 new 和删除。

Example

class demo  {
public:
  int i;
  std::list<int> mylist;
}

int main() {
demo dd = new demo(); // -> Don't want to track this. Just want to track
                      //    mylist(size of my list) 
}

我发现 std 有它自己的分配器选项。例如列表有它是分配器

template < class T, class Alloc = allocator<T> > class list;

如果我没有定义任何内容,默认分配器是什么。我有数千个列表,但没有一个有分配器,我不想手动更改每个列表。所以,我在想是否有办法可以用我的分配器替换默认分配器。

这个怎么做 ?


标准容器的默认分配器是std::allocator http://en.cppreference.com/w/cpp/memory/allocator,它用于所有标准容器(std::vector, std::list等)当未提供分配器时。

要跟踪分配和释放,您必须创建一个可用于跟踪的分配器。你可以使用这样的东西:

template<typename _Ty>
struct MyAllocator
{
    typedef _Ty value_type;
    static _Ty* allocate(std::size_t n) 
    {    
        //Code that runs every allocation
        ...
        return std::allocator<_Ty>{}.allocate(n); 
    }

    static void deallocate(_Ty* mem, std::size_t n)
    {
        //Code that runs every deallocation
        ...
        std::allocator<_Ty>{}.deallocate(mem, n);
    }
};

MyAllocator镜子std::allocator但它允许您在发生分配时运行一些自己的代码。你想放什么取决于你。

有两种方法可以让所有容器都使用您的分配器。

  1. 您可以替换所有实例std::list (or std::vector, std::map等)带有模板别名。为了std::list别名看起来像这样:

    template<typename _Ty>
    using MyList = std::list<_Ty, MyAllocator<_Ty>;
    

    替换所有实例std::list with MyList。现在您的分配器已被所有容器使用。将此应用到另一个容器更改list容器的名称(例如vector将别名重命名为MyVector并改变std::list to std::vector).

  2. 如果您无法编辑该文件或不想修改它,还有另一个选择。您可以使用宏来替换所有实例list与您定义的类。该类必须已在中声明namespace std你必须确保包括<list>在设置宏之前。设置为std::list看起来像这样:

    #include <list>
    
    namespace std
    {
        template<typename _Ty, typename _Alloc = MyAllocator<_Ty>>
        using tracked_list = list<_Ty, _Alloc>;
    }
    
    #define list tracked_list
    

    对于不同的容器,更改list到您想要更换的任何容器(例如vector change tracked_list to tracked_vector在两个位置并替换list with vector在所有三个地点。确保此代码位于可以使用的任何其他包含之前std::list。如果将其放入头文件中,请在其他内容之前包含该头文件。如果它在源文件中,请将其放在文件的顶部。此代码不会覆盖用户提供的分配器,但会使您的分配器成为默认分配器。

    此方法将更改变量名称,这可能会影响您的代码。如果可能,您应该使用方法 1。但是,如果您有无法更改的代码或外部标头中的代码并且这也需要应用于该代码,则此方法应该可行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过STL库跟踪内存分配 的相关文章

  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐