【问题标题】:Visual Studio 2010 C++: Get size of memory block allocated by mallocVisual Studio 2010 C++:获取 malloc 分配的内存块大小
【发布时间】:2011-06-24 17:35:43
【问题描述】:

如果给定一个指向使用 malloc 分配的内存块的指针,我如何获得它的大小?

例如:

void* ptr = malloc( 10 ); //Allocate 10 bytes
printf( "%d", GetMemSize( ptr ) ); //Should print 10

我想这样做是为了调试。

【问题讨论】:

    标签: c++ windows visual-studio memory-management


    【解决方案1】:

    在 Visual C++ 中,您可以使用 _msize()

    【讨论】:

      【解决方案2】:

      没有通用(标准化)方法来执行此操作,因为malloc 的实现是特定于系统和架构的。唯一保证的行为是malloc(N) 将返回至少 N 个字节或 NULL。 malloc 总是分配比请求更多的内存 - 存储请求的大小 (N),通常还有一些额外的簿记数据。

      Windows / Visual C++ 特定:

      附加数据存储在malloc返回地址之前的内存段中。

      如果p = malloc(N)p != 0,如果只知道p,则可以使用以下代码确定请求的内存大小:

      Windows NT:unsigned long ulAllocSize = *((unsigned long*)p - 4);

      Windows CE:unsigned long ulAllocSize = *((unsigned long*)p - 2);

      请注意,ulAllocSize 不是用malloc 分配的整个块的大小,而只是作为其参数传递的值 - N

      【讨论】:

        【解决方案3】:

        Microsoft CRT 有一个函数size_t _msize(void *memblock);,它将为您提供分配块的大小。请注意,由于堆管理器管理内存的方式,这可能(实际上很可能)大于要求的大小。

        如其他答案所述,这是特定于实现的。

        【讨论】:

        • 我实际测试过这个 - 当我 malloc() 10 bytes _msize() 返回 10。
        【解决方案4】:

        如果您知道它的实现方式,那么您只能获得尺寸,因为它是特定于实现的。我必须跟踪内存并且必须编写自己的包装器,如this question。所以正如大卫赫弗南所说,你必须记住我在包装纸中必须做的尺寸

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 2016-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-17
          • 1970-01-01
          相关资源
          最近更新 更多