内存结构、堆结构及内存分配函数
来源:互联网 发布: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()表示定位分配,意思是在已分配的空间中,再重新分配,自己管理空间。
- 内存结构、堆结构及内存分配函数
- 内存结构-堆结构-内存分配函数
- JVM堆内存结构分配
- linux程序的内存结构 堆结构 内存分配函数 brk/sbrk
- java内存结构及内存分配详解
- JVM内存结构及内存分配策略
- 结构动态内存分配
- 结构体分配内存
- JVM堆内存结构
- 结构体的内存分配
- 结构体与内存分配
- 结构体指针内存分配
- Java内存分配的结构
- 结构体的内存分配
- 结构体的内存分配
- 结构体的内存分配
- 结构体的内存分配
- 结构体的内存分配
- 基于STM32的CAN通信网-----一种ID配置方法
- EBS常用数据表
- C++ 输入输出流之标准I/O
- C 冒泡排序 练习
- MFC---消息机制
- 内存结构、堆结构及内存分配函数
- Shell脚本 字符串大小比较 字符串是否相等比较 字符串是否为空判断
- Android开发学习之SQLite数据库初探
- 黑马程序员-----java面向对象之封装、构造函数、this关键字、static静态总结*
- Regression(4)-------Logistic Regression & Regularization
- 双向链表的基本操作
- Linux 下 Sublime Text 2 破解
- 乐观锁与悲观琐的区别
- 数据结构应用标准模版库——Sorting