【问题标题】:is it possible to get memory block size allocated by 'new'?是否可以获得“新”分配的内存块大小?
【发布时间】:2011-08-16 02:01:57
【问题描述】:

您好,我需要记录我的堆,但现在我只是想用我的函数重载“新”运算符。

我需要总结在 malloc() 或 Heap*() 或其他 windows mem* 函数之后增加的内存的实际计数字节

但现在我需要分析当前的堆实现。是否可以获得像 HeapAlloc() 函数 - HeapSize() 分配的块大小?

.

【问题讨论】:

  • 你知道块有多大,因为你一开始就要求一定的大小。
  • 是的,我现在正在开发这个
  • ...虽然分配器可能会返回比您要求的更大的块,但我不知道是否有任何方法可以检测到。
  • 如果你没有分配内存怎么办,如果其他第三方库做了,你想根据这个事实测试一些条件,这样你就不会溢出内存......那会很痛苦,但是会发生这些情况...

标签: c++ windows winapi memory-management c++builder


【解决方案1】:

_msize

根据文档,它适用于 calloc、malloc 和 realloc

但是,至少在 Visual Studio 下,使用默认分配器,它也适用于 new

使用它不是一个好主意,但是,它可能会为您的分析工作。

还有一件事:

VMMap 等外部工具可能有助于此类分析。

【讨论】:

  • new 可能并不总是使用malloc
【解决方案2】:

我可以看到您没有搜索文档。

HeapSize() exists.


编辑仔细想想,也许您是在要求HeapSize()替代方法,您可以在使用new 自己执行分配时使用它。

答案是否定的。标准分配例程没有任何东西可以获取有关内存块的信息,因为:

  • 这高度依赖于实现,并且
  • 您已经知道块大小(因为您首先指定了它),那么膨胀的意义何在?

事实上HeapSize() 执行此操作的Windows 的依赖于实现的函数,但您只能在执行HeapAlloc() 时使用它。

有[也是非标准的]_msize 可以与malloc 和朋友一起使用,但new 可能不能使用malloc

因此,我建议您自己在分配器中跟踪大小。

【讨论】:

  • new 可以通过使用 HeapAlloc() 的其他机制来真正分配
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 2013-06-29
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2011-02-02
  • 2011-06-24
相关资源
最近更新 更多