内存结构、堆结构及内存分配函数

来源:互联网 发布:js关闭alert弹出框 编辑:程序博客网 时间:2024/04/27 14:42

Linux对内存结构的描述

1、在linux中,目录/proc/${pid}/下存放着相应进程运行时的所有信号,其它maps中包含对该进程的内存分配信信息,在命令行下执行maps即可查看(必须是当前执行中的进程,进程结束时,对应目录自动销毁)补:ps aue 查看有效进程 a所有用户 u当前用户 d当前进程

可以以如下程序做实验:(32位ubuntu10.04)

编译执行得到如下结果:

重开一个命令行,使该程序保持运行状态,进入到相应的目录,可以看到当前执行程序的进程号,然后进入要对应目录可以看到内存信息。


一共有6列
第一列代表内存段的虚拟地址
第二列代表执行权限,r,w,x不必说,p=私有 s=共享
不用说,heap和stack段不应该有x,否则就容易被xx,不过这个跟具体的版本有关
第三列代表在进程地址里的偏移量
第四列映射文件的主设备号和次设备号
第五列映像文件的节点号,即inode
第六列是映像文件的路径

所有程序在内存中可分为四个基本部分:代码区、全局区、堆区、局部栈。结合./test的运行结果与上图对应,分析对应地址的范围,linux中所有代码首地址08048000,是固定的和windows类似,08048000-08049000显然是代码区,典型我自权根为X,所以常量a3在代码区,man和add也在代码区,a1,b2,a2在全局区0804a000-0804b000,p1显然是在09dc8000-09de9000之间,是堆区,b1和b3局部变量在栈区bfbca000-bfbfd000。

下面用实验编写查看堆和栈的区别:

程序如下:(执行环境同上)



执行结果为:


其按顺序向下,依次是:在栈中的a1、a2、a3与在堆中的p1、p2、p3,显然栈地址是按4字节递减(压栈),而堆是16字节递增。查阅相关资料malloc使用一个数据结构(链表)维护分配空间,链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息(总共点十六个字节),对malloc分配的空间不要越界访问.因为容易破坏后台维护结构.导致malloc/free/calloc/realloc不正常工作。意思是,如果对malloc分配的空间p1,若*(p1+1)=2,会破坏堆结构链表,导致堆空间错误。

C++的new与malloc的关系:

new的实现使用的是malloc来实现的.new使用malloc后,还要初始化空间.基本类型,直接初始化成默认值.自定义数据类型,调用指定的构造器,而delete调用free实现。delete负责调用析构器.然后在调用free。new只调用一个构造器初始化,new[]循环对每个区域调用构造器。new()表示定位分配,意思是在已分配的空间中,再重新分配,自己管理空间。


原创粉丝点击