硬件层次
内存结构管理
内核层次
内存映射
堆扩展
语言层次
c:malloc
c++:new
数据结构层次
STL
智能指针
1.问题
malloc怎么分配空间?
malloc与new 的关系?
2.Linux对内存的管结构描述
1. /proc/${pid}/ 存放进程运行时候所有的信息(包括内存结构)
ps aue:查看所有用户的有效进程
cat maps:运行程序的内存结构
结论:
任何程序的内存空间分成4个基本部分
1.代码区
2.全局栈区
3.堆
4.局部栈
#include:unix标准头文件
2.理解程序的变量与内存空间的关系
结论:
1.内存分为四个区。
2.各种变量对应存放区
3.堆栈是一种管理内存的数据结构
4.查看程序的内存地址
3.理解malloc 的工作原理
malloc 使用一个数据结构(链表)维护我们分配的空间,链表的构成:
分配的空间/上一个空间数据/下一个空间数据
对malloc 分配的空间不要越界访问,因为容易破坏后台的维护结构,导致
4.c++的new与malloc的关系
malloc new new[]
realloc new(void*):定位分配:char a[20];int *p=new(a) int;//指定从a处分配
与realloc一样,形式不同而已
calloc new[]
free delete delete[]
结论:new的实现使用malloc来实现
区别:new使用malloc后,还要初始化空间,基本类型,直接初始化成默认值
UDT类型,调用制定构造器
delete调用free实现。
delete负责先调用析构器,然后再调用free。
new与new[]区别
new只调用一个构造器初始化,new[]循环对每一个区域调用构造器
delete与delete[]区别
程序运行时内存布局:
text 代码段:存放可执行程序 data/bss数据段:存放全局数据,静态全局数据,全局常量
heap堆:
stack栈:函数,函数形参,非静态局部变量,函数返回地址,寄存器变量register
环境数据:
getpagesize():取得内存一页的大小
void* sbrk():调整终点,返回原来的终点。
int brk();指定新的终点:用完后的第一个
void*alloca(size_t size):在栈里分配内存
void* malloc(size);
内存分配不联系的原因:分配内存的同时,还要一部分空间存储控制信息
realloc(p4,0);//free(p4)
mmap:内存映射
阅读(1950) | 评论(0) | 转发(3) |