VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1668|回复: 7

Release版的对一个指针分配内存之后块的大小是记录在哪儿?

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-2 17:40:01 | 显示全部楼层 |阅读模式
Release版的对一个指针分配内存之后这个分配了的块的管理信息诸如块的大小是放在哪儿?
   

    近日在深入剖析C++问题的时候,碰到一个百思不得其解的问题。就是C++程序编译之后对堆的使用管理Debug和Release版不一样,Debug版的好懂,但是Release版的它是怎么管理的呢?Debug版的是在内存块的前32个字节存放一个双链表的结构体,这个结构体中的一个成员就是内存块的大小。但Release版的是放在哪儿?执行下面的程序Release版的根本不知道它放的是什么东西?哪位大虾能解惑一下?
main( )
{
    int* pInt = new int[2];
    for(int i = 1; i< =8; i++)
    {
        printf("%x\n",*(pInt-i));//打印出在Pint前32字节的内存
    }
  .....
  .....
}
Debug版执行显示的结果是
fdfdfdfd
33
1
8      //内存块大小
0
0
372a80 //下一块地址
3729f0 //前一块地址

但是Release版的执行是这样的
180764
230004
0
0
abababab
abababab
baad0a00
ffffffff
内存块大小在这根本就没有,那它会保存到哪儿去呢?还是不用记录?不记录的话释放的时候怎么收集?
Pint前32字节的东西存的是什么?
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-1-2 21:51:01 | 显示全部楼层
不懂 学习
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-3 12:18:01 | 显示全部楼层
记录肯定是要的,要不然怎么知道长度。
或者方式不一样:使用表格来存储?
回复

使用道具 举报

0

主题

41

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-1-3 12:36:01 | 显示全部楼层
好像没有记录的
回复

使用道具 举报

0

主题

36

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-1-3 17:48:01 | 显示全部楼层
操作系统自己记录,回收,其实每一个堆上面的东西它的首地址都会记录它所分配的大小,分配给的应用程序的ID,操作系统上面讲的,楼主去补习补习.
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-1-5 14:48:02 | 显示全部楼层
lklklk(学C++而不知疲倦)
操作系统自己记录,回收?不要说的这么笼统,应该是每个进程自己记录自己内存块内的使用情况,操作系统记录的是进程使用了哪些内存页(也即块)!至于内存页内的操作系统是不管的
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-10 15:00:02 | 显示全部楼层
VC Release下每个程序和每个dll用_crtHeap来管理堆,_crtHeap是个全局句柄,
_crtheap = HeapCreate()初始化,
HeapAlloc( _crtheap, 0, size );
retval = HeapFree(_crtheap, 0, pBlock);
我了解不深刻,你可以跟踪一下new和delete的执行
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-6 13:30:01 | 显示全部楼层
LZ说的这个是特殊情况,理论上申请的内存,给上层是不包含大小的;
操作系统内部记录
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表