linux高级编程 - 前言&内存管理
2017-09-04 01:02
537 查看
杨强 linux高级编程 day01 am
程序员的基本素养:进程管理、内存管理、文件系统管理、IO、(设备驱动)
应用:数据库、网络、UI、openGL、shell等等
内存管理
层次:
1. 硬件层次:内存结构管理(段页管理)
2. 内核层次:内存映射、堆扩展
3. 语言层次:c语言 malloc c++:new
4. 数据结构层次:STL、智能指针
STL内存托管存在的问题:
对多线程的支持存在问题
对共享内存存在问题
格式控制符“%p”中的p是pointer(指针)的缩写。
指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。
程序示例1
输出:
0x234e010
0x234e030
0x234e050
0x234e070
0x234e090
0x234e0b0
问题:我们malloc分配的是4个字节,为什么结果是16个字节?
参考
关于C语言的malloc函数以及内存泄漏的问题
malloc 函数详解
内存越界将会出现的严重问题!!
内存越界分析与解决办法
http://blog.csdn.net/jaymade/article/details/6589566
改为 c++
问题:
malloc怎么分配空间?
malloc与new的关系?
Linux对内容的描述
/proc/${pid}/ 存放进程运行时所有的信息
一个小程序
整个程序运行的内存结构
结论
任何程序的内存空间分成4个基本部分
1. 代码区 (地址基本是固定的)
2. 全局栈区
3. 堆
4. 局部栈
程序加载器 ld-linux.so.2
深入理解LINUX下动态库链接器/加载器ld-linux.so.2
http://blog.csdn.net/elfprincexu/article/details/51701242
所以要执行程序,也可以通过
程序示例
结果
各个变量的地址
结论
理解malloc的工作原理
malloc使用一个数据结构(链表)维护分配空间
链表的构成:分配的空间/上一个空间/下一个空间/空间大小等信息
对malloc分配的空间不要越界访问,因为容易破坏后台维护结构,导致malloc/free/calloc/realloc不正常工作
C++的 new 与 malloc 的关系
malloc new new[]
realloc ??
calloc ??
free delete delete[]?
结论:new的实现使用的是malloc来实现的。
区别:new使用malloc后,还要初始化空间
基本类型:直接初始化成默认值
UDT类型(结构体等用户自定义类型):调用构造器
delete通过调用free实现:delete负责调用析构函数,然后再调用free
new与new[]的区别:new只调用一个构造器,new[] 会循环地对每个区域调用构造器
delete与delete[]的区别
函数调用栈空间的分配与释放
程序员的基本素养:进程管理、内存管理、文件系统管理、IO、(设备驱动)
应用:数据库、网络、UI、openGL、shell等等
内存管理
层次:
1. 硬件层次:内存结构管理(段页管理)
2. 内核层次:内存映射、堆扩展
3. 语言层次:c语言 malloc c++:new
4. 数据结构层次:STL、智能指针
STL内存托管存在的问题:
对多线程的支持存在问题
对共享内存存在问题
格式控制符“%p”中的p是pointer(指针)的缩写。
指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。
程序示例1
#include <stdio.h> #include <stdlib.h> main() { int *p1 = malloc(4); int *p2 = malloc(4); int *p3 = malloc(4); int *p4 = malloc(4); int *p5 = malloc(4); int *p6 = malloc(4); printf("%p\n", p1); printf("%p\n", p2); printf("%p\n", p3); printf("%p\n", p4); printf("%p\n", p5); printf("%p\n", p6); }
输出:
0x234e010
0x234e030
0x234e050
0x234e070
0x234e090
0x234e0b0
问题:我们malloc分配的是4个字节,为什么结果是16个字节?
参考
关于C语言的malloc函数以及内存泄漏的问题
malloc 函数详解
malloc的原型:(void *)malloc(int size) malloc函数的返回值是一个void类型的指针,参数为int类型的数据,即申请分配的内存大小,单位是字节。内存分配成功之后,malloc函数返回这块内存的首地址,你需要一个指针来接受这个地址
内存越界将会出现的严重问题!!
内存越界分析与解决办法
http://blog.csdn.net/jaymade/article/details/6589566
改为 c++
#include <stdio.h> #include <stdlib.h> int main() { int *p1 = new int; int *p2 = new int; int *p3 = new int; int *p4 = new int; int *p5 = new int; printf("%p\n", p1); printf("%p\n", p2); printf("%p\n", p3); printf("%p\n", p4); printf("%p\n", p5); return 0; }
输出: 0x2299c20 0x2299c40 0x2299c60 0x2299c80 0x2299ca0
问题:
malloc怎么分配空间?
malloc与new的关系?
Linux对内容的描述
/proc/${pid}/ 存放进程运行时所有的信息
一个小程序
main(){ while(1); }
整个程序运行的内存结构
结论
任何程序的内存空间分成4个基本部分
1. 代码区 (地址基本是固定的)
2. 全局栈区
3. 堆
4. 局部栈
程序加载器 ld-linux.so.2
深入理解LINUX下动态库链接器/加载器ld-linux.so.2
http://blog.csdn.net/elfprincexu/article/details/51701242
所以要执行程序,也可以通过
/lib/ld-linux.so ./test # 我在ubuntu上是 # /l/lib64/ld-linux-x86-64.so.2 ./test
程序示例
#include <stdio.h> #include<stdlib.h> #include<unistd.h> int add(int a, int b){ return a+b; } int a1 = 1; static int a2 = 2; const int a3 = 3; main(){ int b1 = 4; static int b2 = 5; const int b3 = 6; int *p1 = malloc(4); printf("a1: %p\n", &a1); printf("a2: %p\n", &a2); printf("a3: %p\n", &a3); printf("b1: %p\n", &b1); printf("b2: %p\n", &b2); printf("b3: %p\n", &b3); printf("p1: %p\n", &p1); printf("main: %p\n", main); printf("add: %p\n", add); printf("%d\n", getpid()); while(1); }
结果
各个变量的地址
结论
1. 内存分4个区 2. 各种变量有对应的存放区 3. 堆栈是一种管理内存的数据结构
理解malloc的工作原理
malloc使用一个数据结构(链表)维护分配空间
链表的构成:分配的空间/上一个空间/下一个空间/空间大小等信息
对malloc分配的空间不要越界访问,因为容易破坏后台维护结构,导致malloc/free/calloc/realloc不正常工作
C++的 new 与 malloc 的关系
malloc new new[]
realloc ??
calloc ??
free delete delete[]?
结论:new的实现使用的是malloc来实现的。
区别:new使用malloc后,还要初始化空间
基本类型:直接初始化成默认值
UDT类型(结构体等用户自定义类型):调用构造器
delete通过调用free实现:delete负责调用析构函数,然后再调用free
new与new[]的区别:new只调用一个构造器,new[] 会循环地对每个区域调用构造器
delete与delete[]的区别
函数调用栈空间的分配与释放
相关文章推荐
- [Linux高级编程]内存管理&映射&分配
- Linux&shell之高级Shell脚本编程-创建函数
- linux高级编程——编程中的内存管理
- Linux&shell之高级Shell脚本编程-创建菜单
- Linux&shell之高级Shell脚本编程-创建函数
- [Linux高级编程]工具&库
- UNIX环境高级编程学习之第四章文件和目录-用C实现Shell中的"ls -l"功能
- C#2005高级编程11Chapter内存管理和指针
- 【linux高级程序设计】(第十二章)Linux多线程编程 2
- linux高级编程day10 笔记
- UNIX 环境高级编程(二)—— linux共享库,/etc/ld.so.conf 及 ld.so.conf.d/libc.conf
- x4412开发板&ibox卡片电脑项目实战8-Linux下的C语言编程风格
- linux高级编程基础系列
- Linux高级编程(三)
- 第三步Linux高级编程
- linux高级编程之read和write用法
- linux高级编程基础系列:线程间通信
- linux下c编程内存管理及操作方式
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(三) Block语法
- Visual Basic 2010&.NET 4高级编程(第6版)pdf