delphi - 如何找到指针引用的内存大小?

标签 delphi memory-management pointers

GetMem 允许您分配任意大小的缓冲区。在某个地方,大小信息由内存管理器保留,因为当您将指针传递给 FreeMem 时,您不需要告诉它缓冲区有多大。

该信息仅供内部使用,还是有任何方法可以检索指针指向的缓冲区的大小?

最佳答案

考虑到 FreeMem() 不要求,由 GetMem() 返回的指针引用的 block 的大小似乎必须可以从某个地方获得。您确定要释放的内存大小 - 系统必须能够确定这一点,那么为什么应用程序开发人员不能确定呢?

但是,正如其他人所说,所涉及的内存管理的精确细节并不是由系统本身定义的......Delphi 一直有一个可替换的内存管理器架构,以及为兼容的内存管理器定义的“接口(interface)”不要求它们为任意指针提供此信息。

默认的内存管理器将以任何适合它的方式维护必要的信息,但其他一些内存管理器几乎肯定会使用完全不同的(如果表面上相似的)机制,因此即使您基于对某个内存管理器的深入了解而破解了一个解决方案内存管理器,如果您更改内存管理器(或者如果它为您更改,例如通过系统定义的更改,您可能默认使用的内存管理器,例如在 Delphi 2005 和 2006 之间发生),那么您的解决方案几乎肯定会破裂。

一般来说,对于 RTL/内存管理器来说,应用程序应该已经知道 GetMem() 分配的指针引用了多大的内存,这并不是一个不合理的假设,因为应用程序首先要求它! :)

如果您的应用程序没有分配指针,那么您的应用程序的内存管理器绝对无法知道它引用的 block 有多大。例如,它可能是指向某个较大块的中间的指针 - 只有指针的源才可能知道它与它引用的内存的关系!

但是,如果您的应用程序确实需要维护有关其自己指针的信息,那么它当然可以轻松地设计一种方法来通过简单的单例类或函数库来实现此目的,通过该方法<路由strong>GetMem()/FreeMem()请求,以维护每个当前分配的指针的关联请求大小的记录。当然,这样的机制可以根据需要轻松地公开这些信息,完全可靠并且独立于正在使用的任何内存管理器。

如果需要“准确”记录,这可能是唯一的选择,因为给定的内存管理器实现可能会为给定大小的数据分配比实际请求更大的内存块。我不知道实际上是否有内存管理器这样做,但理论上,为了效率,它可以这样做。

关于delphi - 如何找到指针引用的内存大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1319273/

相关文章:

c++ - 静态分配继承对象的数组

c - 分配和分配 : different memory size allocated

delphi - 我无法在继承的这个旧 Delphi 项目中包含版本号。我如何解决它?

.net - 打印为 pdf

delphi - 防止插入空备忘录

java - java中如何分析内存碎片?

windows - Delphi自删除程序

c++ - 返回指向对象数组的指针并将其分配给指针

c - 如何在函数中为指针数组分配内存和赋值?

c - 指针结构的问题