2017-09-13 81 views
1

我试图找出有多少内存(以字节为单位)列表正在使用。如何跟踪列表的分配内存?

的问题是在此示出:

enter image description here

它显示了一个容器列表存储指向其它列表(存储列表)各存储均匀尺寸的元件(比方说每10个字节)。所以第一个存储列表存储了4个元素,接下来是30个,然后是下一个12和10,最后一个是5个元素。所有的元素都是相同的C++类型(这只是普通的旧数据的结构)。

我的目标: 容器列表上方应该有目前的规模可变的,它记录的字节数,他所指向的列表(与*上一个和下一个*指针所有跟踪的空间)。

到目前为止,我所尝试的是使用分配器来跟踪列表(通过静态类变量)分配的字节数。虽然这会导致std :: list :: splice出现问题,但从列表see here移动元素时:将不跟踪拼接到另一个容器列表的元素。它甚至应该能够跟踪传输的字节以将字节Count添加到另一容器列表的当前大小。

  • 我一定要避免使用STD分配器内存跟踪和 改用升压转换器的侵入名单莫名其妙跟踪记忆像是 呢?

  • 什么样的C++功能可能通过解决我的
    问题来支持我?

+1

恕我直言'的std :: allocator'是首选。你在哪里看到你的实施问题? –

+0

这可能更适合[计算机科学](https://cs.stackexchange.com/)。 – Ron

+1

@KavehVahedipour在我的解决方案中,std :: allocator的问题在于只能跟踪所有容器列表使用的内存总量。如果我使用两个不同的分配器来分离跟踪的内存计数器,我不能使用std :: list :: splice,因为这需要使用相同的分配器。即使可能,传输也不会跟踪字节,因为只是指针被重新排列(不调用std :: allocator的分配)。 – Robert

回答

0

我发现你可以使用EASTL分配器,因为它们绑定在每个列表对象上。

所以在EASTL :: CustomAllocator :: allocate和EASTL :: CustomAllocator :: deallocate上,你可以通知主列表子列表(这里是:存储列表)的分配字节已经改变了它们的权重(这里是:size以存储列表分配的字节数)。

这样主表(这里:容器列表)总是得到一个更新的权重,它被缓存并绑定到主列表。

对于CustomAllocator应通知主列表,请参阅我的回答是:

How to track memory usage using EASTL?