Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何找到指针引用的内存大小?

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

Stack Overflow用户
提问于 2009-08-23 10:55:34
回答 5查看 2.3K关注 0票数 8

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

该信息是否仅供内部使用,或者是否有办法检索指针所指向的缓冲区的大小?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-23 13:23:35

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

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

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

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

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2009-08-23 12:01:28

它是供内部使用的,因为它取决于所使用的MemoryManager。顺便说一句,这就是为什么你需要使用同一个MemoryManager中的GetMem/FreeMem对;没有标准的方法来知道内存是如何被保留的。

在Delphi语言中,如果您查看FastMM4,您可以看到内存是以小、中或大块的形式分配的:

小数据块分配在固定大小的数据块池中(数据块大小在数据块类型中的池级别定义)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  TSmallBlockType = packed record
    {True = Block type is locked}
    BlockTypeLocked: Boolean;
    {Bitmap indicating which of the first 8 medium block groups contain blocks
     of a suitable size for a block pool.}
    AllowedGroupsForBlockPoolBitmap: byte;
    {The block size for this block type}
    BlockSize: Word;

中数据块也以池的形式分配,但大小可变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  {Medium block layout:
   Offset: -8 = Previous Block Size (only if the previous block is free)
   Offset: -4 = This block size and flags
   Offset: 0 = User data / Previous Free Block (if this block is free)
   Offset: 4 = Next Free Block (if this block is free)
   Offset: BlockSize - 8 = Size of this block (if this block is free)
   Offset: BlockSize - 4 = Size of the next block and flags

  {Get the block header}
  LBlockHeader := PCardinal(Cardinal(APointer) - BlockHeaderSize)^;
  {Get the medium block size}
  LBlockSize := LBlockHeader and DropMediumAndLargeFlagsMask;

大数据块按所需大小单独分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  TLargeBlockHeader = packed record
    {Points to the previous and next large blocks. This circular linked
     list is used to track memory leaks on program shutdown.}
    PreviousLargeBlockHeader: PLargeBlockHeader;
    NextLargeBlockHeader: PLargeBlockHeader;
    {The user allocated size of the Large block}
    UserAllocatedSize: Cardinal;
    {The size of this block plus the flags}
    BlockSizeAndFlags: Cardinal;
  end;
票数 5
EN

Stack Overflow用户

发布于 2009-08-23 11:07:37

是仅供内部使用的信息,还是有办法检索指针所指向的缓冲区的大小?

这两个“选择”是否相互矛盾?

它仅供内部使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1319273

复制
相关文章
指针的引用
有这么一个场景:程序中某一模块在对数据进行处理,另一个模块想要将其处理的数据写入文件,这时候有两种方案,一个是通过接口将数据拷贝出来,好处是写数据到文件不影响处理数据,缺点是占用内存较大;一个是将数据的地址传递出来,这样写入文件的时候不能对数据进行处理,好处是节省内存,不用重复的分配和释放内存。
零式的天空
2022/03/25
2970
【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )
C++ 对 C 扩充 : 引用 ( Reference ) 概念 , 是 C++ 在 C 的基础上进行的扩充 , 在 C 语言中是没有引用的 ;
韩曙亮
2023/03/27
1.2K0
详解c++指针的指针和指针的引用
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值。我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i
lpxxn
2018/01/31
1.3K0
关于变量、指针、别名(引用)和指针的指针
C/C++中的指针和别名这个东西确实是够恶心的。今天蛋疼的就写一下这些东西的区别,变量永远是最简单的没有什么技术含量,那么另外一个比较简单的就是别名了,其实个人感觉这个东西完全可以看作是一个人的“小名”,只是对同一个变量多了一个称呼而已,指向的数据和地址是和原变量完全一致的,并且用&进行取地址操作的得到的地址和原变量的地址是完全一致的(因而在对指针进行赋值的时候如果直接对指针地址操作则需要对变量或者别名使用&进行取地址运算,如果要直接赋值则需要使用*p=进行赋值)。最复杂的就是指针了,同样个人认为指针到头来就是一个地址,这样可能会比较好理解一些。例如*pointer,那么带有*(解引用操作符)的时候则是表示的数值,如果没有*则表示的是地址。也就是说可以将pointer看成一个内存地址在这个地址中保存的是另外一个数据的地址,当存在*的时候表示取该地址存取的内容,否则则是取这个变量保存的地址。指针的指针则就更加复杂了,例如**p,那么可以看作指针保存的数据是另外的一个指针,解引用操作一次将会得到一个*p,这仍然是个指针,当进行二次解引用操作的时候(**p)才能读到p中保存的数据信息。这么说可能比较难理解,那么看个实例就明白了。效果如下图:
obaby
2023/02/28
1.4K0
关于变量、指针、别名(引用)和指针的指针
指针和引用的区别
先看代码输出是什么? 最后输出是: 1234567890 hello 指针和引用主要区别 1 在C++中,指针和引用经常用于函数的参数传递, 然而,指传递参数和引用传递参
程序员小王
2018/04/13
7340
指针和引用的区别
nim的引用和指针
nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置 nim区分可被追踪的引用和不可被追踪的引用 不可被追踪的引用又称为指针 可被追踪的引用可以被垃圾回收器回收 不可被追踪的引用指向手动分配的对象,或其他地方创建出来的一块内存区域 这也就是说,不可被追踪的引用是不安全的 对于某些底层操作,不可被追踪的引用有其存在的必要 可被追踪的引用使用ref关键字定义, 不可被追踪的引用使用ptr关键字定义 空下标的方括号[]可以用来解引用 addr方法可以返
liulun
2018/01/12
9400
指针(*)、取地址(&)、解引用(*)与引用(&)
指针是一个包含了另一个变量地址的变量,您可以把一个包含了另一个变量地址的变量说成是"指向"另一个变量。变量可以是任意的数据类型,包括对象、结构或者指针。
Twcat_tree
2022/11/30
8860
【C++】C++ 引用详解 ⑦ ( 指针的引用 )
普通变量的 引用 , 调用时可以直接当做 普通变量 使用 , 可实现的功能 相当于 一级指针 ;
韩曙亮
2023/10/15
3830
【C++】C++ 引用详解 ⑦ ( 指针的引用 )
引用,指针,值传递
其中运用了指针,引用进行数互换,但是它们所执行完的效果却是不一样的。 通过观察发现,引用传递和按值传递的形式类似,只能从它对于函数的定义里才能看出区别。 引用和指针成功交换了wallet里的内容,值传递却没能完成这个任务。在引用传递中,a,b是wallet1,wallet2的别名,值传递,a,b是复制了wallet1和wallet2里面的内容,因此交换a,b就不会影响实参的值。
用户8247415
2021/04/13
4720
地址、指针与引用
计算机本身是不认识程序中给的变量名,不管我们以何种方式给变量命名,最终都会转化为相应的地址,编译器会生成一些符号常量并且与对应的地址相关联,以达到访问变量的目的。  
Masimaro
2018/08/31
7050
C++ 指针、引用的梳理
& 地址运算符,可以概括为 取址运算符,从变量或对象等获取到该元素所在的内存空间中对应的地址。
雪碧君
2023/02/15
4950
令人疑惑的引用和指针
在C++ 11中,新增了一种引用(本文都指左值引用)。从作用上来讲,它和指针类似,都可以用来间接引用对象,他们之间到底有什么异同呢?
编程珠玑
2019/09/03
6120
C语言 | 指针引用数组
指针变量既可以指向变量,也可以指向数组元素,所谓数组元素的指针就是数组元素的地址。
小林C语言
2021/04/22
1.9K0
C语言 | 指针引用数组
C++ 指针和引用的区别
该文介绍了C++指针和引用的区别:指针是一个变量,它存储的是内存地址,可以指向任何数据类型,引用的本质是变量的别名,用于简化代码。使用引用时,不需要进行类型转换,代码更简洁。同时,指针和引用在内存中会占据不同的空间,引用会存储在栈中,而指针则会存储在堆中。
chaibubble
2018/01/02
1K0
c++:指针和引用的区别
3、引用在初始化时引用一个实体后,就不能再引用其他实体,因为其本质是一个指针常量,无法改变指向。而指针可以在任何时候指向任何一个同类型实体。
青衫哥
2023/03/31
5360
c++:指针和引用的区别
8.3 通过指针引用数组
1、指针变量既可以指向变量,也可以指向数组元素。所谓数组元素的指针就是数组元素的地址。
小林C语言
2019/07/12
9130
C++指针与引用的区别
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/53871767
大黄大黄大黄
2018/09/14
6880
【C++】自引用this指针的秘密
当我们在进入一个房子之后,可以看见房子里的桌子、椅子、地板等,但是看不到房子的全貌。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个个实例。
全栈程序员站长
2022/08/29
8530
【C++】自引用this指针的秘密
7.2 通过指针引用数组
C语言中,数组名(不包括形参数组名,形参数组名不占实际内存单元)代表数组中的首元素
小林C语言
2019/08/19
6400
Java String 手工引用指针
手工修改引用的意思就是通过程序来手工修改 String 字符串使用的指针来获得我们需要的值。
HoneyMoose
2022/06/22
2650
Java String 手工引用指针

相似问题

我们如何从给定的内存指针中找到内存大小?

50

如何获取指针指向的内存大小?

40

如何定义返回指针引用的函数?(引用指针与指针)

10

来自空指针和内存大小的QBuffer

234

如何在Java中找到物理内存大小?

70
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文