内存管理层次:

   硬件层次:
内存结构管理
内核算层次:
内存映射
堆扩展
数据结构层次:
智能指针:
stl :在多线程,共享内存有问题
SGI公司实现了STL ,开发了OPENGL库
语言层次:C:malloc
c++:new malloc.c
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p1=malloc();
int *p2=malloc();
int *p3=malloc();
int *p4=malloc();
int *p5=malloc();
printf("%p\n",p1);
printf("%p\n",p2);
printf("%p\n",p3);
printf("%p\n",p4);
printf("%p\n",p5); } gcc malloc.c -o main
[root@monitor ~]# ./main
0x1e95010
0x1e95030
0x1e95050
0x1e95070
0x1e95090 malloc.cpp
g++ malloc.cpp -o ./main #include <stdio.h>
#include <stdlib.h>
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); } [root@monitor ~]# ./main
0x10c4010
0x10c4030
0x10c4050
0x10c4070
0x10c4090 malloc .linux 对内存的结构描述
/proc/${pid} //存放进程运行的所有信息 任何程序内存空间分成4个基本部分
.代码区
.全局栈区
.堆
.局部栈区 虚拟内存技术使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。 每个进程都将这部分空间(从低地址到高地址)分为六个部分: TEXT段:整个程序的代码,以及所有的常量。这部分内存是是固定大小的,只读的。
DATA段,又称GVAR:初始化为非零值的全局变量。
BSS段:初始化为0或未初始化的全局变量和静态变量。
HEAP(堆):动态内存区域,使用malloc或new申请的内存。
未使用的内存。
STACK(栈):局部变量、参数、返回值都存在这里,函数调用开始会参数入栈、局部变量入栈;调用结束依次出栈 https://sploitfun.wordpress.com/2015/02/11/syscalls-used-by-malloc/
https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/comment-page-1/
http://www.evil0x.com/posts/23220.html

.理解程序的变量与程序内存空间的关系
HEAP与STACK 是一种数据结构 ---------------------------------------------------------
test.c main()
{
while();
} [root@monitor ~]# gcc test.c -o main
[root@monitor ~]# ./main [root@monitor proc]# ps -ef|grep main
root : pts/ :: ./main
root : pts/ :: grep main 在/proc/目录下有一个一个程序目录是PID= 对应一个目录 /proc/ [root@monitor proc]# cd /proc/
[root@monitor ]# ll
total
dr-xr-xr-x root root May : attr
-rw-r--r-- root root May : autogroup
-r-------- root root May : auxv
-r--r--r-- root root May : cgroup
--w------- root root May : clear_refs
-r--r--r-- root root May : cmdline
-rw-r--r-- root root May : comm
-rw-r--r-- root root May : coredump_filter
-r--r--r-- root root May : cpuset
lrwxrwxrwx root root May : cwd -> /root
-r-------- root root May : environ
lrwxrwxrwx root root May : exe -> /root/main
dr-x------ root root May : fd
dr-x------ root root May : fdinfo
-r-------- root root May : io
-rw------- root root May : limits
-rw-r--r-- root root May : loginuid
-r--r--r-- root root May : maps
-rw------- root root May : mem
-r--r--r-- root root May : mountinfo
-r--r--r-- root root May : mounts
-r-------- root root May : mountstats
dr-xr-xr-x root root May : net
dr-x--x--x root root May : ns
-r--r--r-- root root May : numa_maps
-rw-r--r-- root root May : oom_adj
-r--r--r-- root root May : oom_score
-rw-r--r-- root root May : oom_score_adj
-r--r--r-- root root May : pagemap
-r--r--r-- root root May : personality
lrwxrwxrwx root root May : root -> /
-rw-r--r-- root root May : sched
-r--r--r-- root root May : schedstat
-r--r--r-- root root May : sessionid
-r--r--r-- root root May : smaps
-r--r--r-- root root May : stack
-r--r--r-- root root May : stat
-r--r--r-- root root May : statm
-r--r--r-- root root May : status
-r--r--r-- root root May : syscall
dr-xr-xr-x root root May : task
-r--r--r-- root root May : wchan [root@monitor ]# ls -l exe
lrwxrwxrwx root root May : exe -> /root/main [root@monitor ]# ls -l cwd
lrwxrwxrwx root root May : cwd -> /root [root@monitor ]# cat maps
//code x
- r-xp ca: /root/main //全局栈区(全局变量)
- rw-p ca: /root/main 3c4e400000-3c4e420000 r-xp ca: /lib64/ld-2.12.so
3c4e61f000-3c4e620000 r--p 0001f000 ca: /lib64/ld-2.12.so
3c4e620000-3c4e621000 rw-p ca: /lib64/ld-2.12.so
3c4e621000-3c4e622000 rw-p :
3c4ec00000-3c4ed8a000 r-xp ca: /lib64/libc-2.12.so
3c4ed8a000-3c4ef8a000 ---p 0018a000 ca: /lib64/libc-2.12.so
3c4ef8a000-3c4ef8e000 r--p 0018a000 ca: /lib64/libc-2.12.so
3c4ef8e000-3c4ef8f000 rw-p 0018e000 ca: /lib64/libc-2.12.so
3c4ef8f000-3c4ef94000 rw-p : 7faf76e78000-7faf76e7b000 rw-p :
7faf76e82000-7faf76e83000 rw-p : //stack(局部栈)
7fff8dd1d000-7fff8dd32000 rw-p : [stack] 7fff8dd4d000-7fff8dd4e000 r-xp : [vdso]
ffffffffff600000-ffffffffff601000 r-xp : [vsyscall] [root@monitor ~]# ldd main
linux-vdso.so. => (0x00007fffb1dbd000)
libc.so. => /lib64/libc.so. (0x0000003c4ec00000) //标准的执行程序,把程序拷到代码区,并执行
/lib64/ld-linux-x86-.so. (0x0000003c4e400000) [root@monitor ~]# /lib64/ld-linux-x86-.so. ./main ---------------------------------------------------- test.c
#include <unistd.h>
#include <stdio.h>
main()
{
printf("%d\n",getpid()); //取得PID
while(); } X86_64 的 Redhat / Centos / Scientific 下面,若要编译、运行32位程序,需要安装以下包:
yum install libgcc.i686
yum install glibc-static.i686
yum install glibc-devel.i686
http://www.cnblogs.com/hummersofdie/p/3953043.html [root@monitor ~]# gcc test.c -m32 -o main //编绎为32位程序
[root@monitor ~]# ./main [root@monitor ]# cat maps 001e0000- r-xp ca: /lib/libc-2.12.so
- ---p ca: /lib/libc-2.12.so
- r--p ca: /lib/libc-2.12.so
- rw-p ca: /lib/libc-2.12.so
- rw-p :
0086a000-0086b000 r-xp : [vdso]
00bc0000-00bde000 r-xp ca: /lib/ld-2.12.so
00bde000-00bdf000 r--p 0001d000 ca: /lib/ld-2.12.so
00bdf000-00be0000 rw-p 0001e000 ca: /lib/ld-2.12.so //code
- r-xp ca: /root/main //global stack
-0804a000 rw-p ca: /root/main //heap
f77b2000-f77b3000 rw-p :
f77ba000-f77bc000 rw-p : //stack
ffa81000-ffa96000 rw-p : [stack] [root@monitor ]# cd /root
[root@monitor ~]# ldd main
linux-gate.so. => (0x00296000)
libc.so. => /lib/libc.so. (0x00297000)
/lib/ld-linux.so. (0x00744000) ---------------------------------------------------------------
test.c #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int add(int a,int b)
{
return a+b;
} int a1=;
static int a2=;
const int a3=; //code // const 都放到了代码区 // static 放到全局区 main()
{
int b1=;
static b2=; //global stack
const b3=; //code
int *p1=malloc();
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("pid:%d\n",getpid());
while(); } [root@monitor ~]# ./test
a1:0x80497e8
a2:0x80497ec
a3:0x80485f4
b1:0xffde8198
b2:0x80497f0
b3:0xffde8194
p1:0x81aa008 //P1分配的内存在HEAP P1变量在STACK
main:0x8048432
add:0x8048424
pid: [root@monitor ]# cd /proc
[root@monitor proc]# cd
[root@monitor ]# cat maps
001e1000- r-xp ca: /lib/libc-2.12.so
- ---p ca: /lib/libc-2.12.so
- r--p ca: /lib/libc-2.12.so
- rw-p ca: /lib/libc-2.12.so
- rw-p :
005cf000-005ed000 r-xp ca: /lib/ld-2.12.so
005ed000-005ee000 r--p 0001d000 ca: /lib/ld-2.12.so
005ee000-005ef000 rw-p 0001e000 ca: /lib/ld-2.12.so
00a03000-00a04000 r-xp : [vdso]
//1G //3G
//code
main ,add,a3
- r-xp ca: /root/test //global stack
a1,a2,b2
-0804a000 rw-p ca: /root/test //heap
p1
081aa000-081cb000 rw-p : [heap] f770b000-f770c000 rw-p :
f7713000-f7715000 rw-p : //stack
b1,b3
ffdd4000-ffde9000 rw-p : [stack] -------------------------------------------------------------------------------------------------------------------------------
test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
int a1=;
int a2-;
int a3=;
int *p1=malloc();
int *p2=malloc();
int *p3=malloc();
printf("%p\n",a1);
printf("%p\n",a2);
printf("%p\n",a3);
printf("%p\n",p1);
printf("%p\n",p2);
printf("%p\n",p3);
printf("%d\n",getpid());
while(); } [root@monitor ~]# gcc test.c -m32 -o test
[root@monitor ~]# ./test
0xa
0x14
0x1e
0x8120008
0x8120018
0x8120028 [root@monitor ]# cat maps
003a6000-003c4000 r-xp ca: /lib/ld-2.12.so
003c4000-003c5000 r--p 0001d000 ca: /lib/ld-2.12.so
003c5000-003c6000 rw-p 0001e000 ca: /lib/ld-2.12.so
0045f000-005ef000 r-xp ca: /lib/libc-2.12.so
005ef000-005f0000 ---p ca: /lib/libc-2.12.so
005f0000-005f2000 r--p ca: /lib/libc-2.12.so
005f2000-005f3000 rw-p ca: /lib/libc-2.12.so
005f3000-005f6000 rw-p :
0063d000-0063e000 r-xp : [vdso] - r-xp ca: /root/test
-0804a000 rw-p ca: /root/test - rw-p : [heap]
f774d000-f774e000 rw-p :
f7755000-f7757000 rw-p :
ff834000-ff849000 rw-p : [stack]
[root@monitor ]# ------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{ int *p1=malloc();
int *p2=malloc();
int *p3=malloc(); *p1=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
printf("%d\n",*p2); printf("%d\n",getpid());
while(); }
[root@monitor ~]# gcc test.c -m32 -o test
[root@monitor ~]# ./test http://blog.jobbole.com/91887/
http://blog.csdn.net/ordeder/article/details/41654509
---------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
printf("%d\n",getpid()); int *p1=malloc();
int *p2=malloc();
int *p3=malloc(); *p1=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
*(p1+)=;
printf("%d\n",*p2);
free(p1); }
~
~
"test.c" 26L, 337C written
[root@monitor ~]# gcc test.c -m32 -o test
[root@monitor ~]# ./test *** glibc detected *** ./test: free(): invalid next size (fast): 0x08f25008 ***
======= Backtrace: =========
/lib/libc.so.(+0x70c81)[0x64bc81]
/lib/libc.so.(+0x73601)[0x64e601]
./test[0x80484e5]
/lib/libc.so.(__libc_start_main+0xe6)[0x5f1d36]
./test[0x8048391]
======= Memory map: ========
- r-xp ca: /lib/ld-2.12.so
- r--p 0001d000 ca: /lib/ld-2.12.so
- rw-p 0001e000 ca: /lib/ld-2.12.so
005db000-0076b000 r-xp ca: /lib/libc-2.12.so
0076b000-0076c000 ---p ca: /lib/libc-2.12.so
0076c000-0076e000 r--p ca: /lib/libc-2.12.so
0076e000-0076f000 rw-p ca: /lib/libc-2.12.so
0076f000- rw-p :
007ef000-0080c000 r-xp ca: /lib/libgcc_s-4.4.-.so.
0080c000-0080d000 rw-p 0001d000 ca: /lib/libgcc_s-4.4.-.so.
00cdb000-00cdc000 r-xp : [vdso]
- r-xp ca: /root/test
-0804a000 rw-p ca: /root/test
08f25000-08f46000 rw-p : [heap]
f7600000-f7621000 rw-p :
f7621000-f7700000 ---p :
f7771000-f7772000 rw-p :
f7778000-f777b000 rw-p :
ffa41000-ffa56000 rw-p : [stack]
Aborted 理解malloc的工作原理: malloc使用一个数据结构(链表)来维护分配的空间。链表的构成:
分配的空间、上一个空间的地址、下一个空间的地址、以及本空间的信息等。
对malloc分配的空间不要越界访问,
因为容易破坏后台的链表维护结构,导致malloc/free/calloc/realloc不正常工作。

C++的new与malloc的关系

小实验:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int *p1 = (int*)malloc(4);
    int *p2 = new int;
    int *p3 = (int *)malloc(4);
    int *p4 = new int;
    int *p5 = new int;
    int *p6 = new int;
    
    printf("%p\n", p1);
    printf("%p\n", p2);
    printf("%p\n", p3);
    printf("%p\n", p4);
    printf("%p\n", p5);
    printf("%p\n", p6);
    return 0;
}

 

运行结果:

结论:new的实现使用的是malloc来实现的。

区别:new使用malloc后,还要初始化空间。

基本类型:直接初始化成默认值。

UDT类型:调用指定的构造器

推论:delete也是调用free实现。

区别:delete会调用指定的析构器,然后再调用free()。

new与new[]的区别:new只调用一个构造器初始化。new[]循环对每个区域调用构造器。

Stu *p=new Stu[30] :创建30个数组对象,每个对象都调用构造器

delete与delete[]的区别:delete只调用一次析构函数,而delete则把数组中的每个对象的析构函数都调用一遍。

eg:Stu *p=new Stu[30]

delete p;   指对P[0]的析构函数调用

delete[] p ;delete则把数组中的每个对象的析构函数都调用一遍,不指定delete[30] p ,而是由系统搞定计算,[],只表示每个区域的对象调用析构函数

都能把p指定的空间释放空间

----------------------------------------------

C 函数     对应        C++函数

malloc                  new

realloc                 new() //定位分配

calloc                  new[]

free                    delete

-------------------------------------------------------------

http://blog.csdn.net/shuaishuai80/article/details/6140979

定位分配:

EG:在指定的位置a分配空间
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <new>
int main()
{
char a[20];
int *p=new(a) int;
return 0;

}

C 高级编程 1的更多相关文章

  1. 读《C#高级编程》第1章问题

    读<C#高级编程>第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但是做事情很能坚持. 本章主要是了解.Net的结构,都是一些概念,并没 ...

  2. MVC高级编程+C#高级编程

    本人今年的目标是学习MVC高级编程和C#高级编程,把自己的基础打的扎实,本文中值是一个开到,定期会在上面记录学习的技术点和心得就,加油吧!!!!!

  3. 《C#高级编程》读书笔记

    <C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) sh ...

  4. jquery插件开发继承了jQuery高级编程思路

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  5. jQuery高级编程

    jquery高级编程1.jquery入门2.Javascript基础3.jQuery核心技术 3.1 jQuery脚本的结构 3.2 非侵扰事JavaScript 3.3 jQuery框架的结构 3. ...

  6. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. multiple definition of `err_sys' 《UNIX环境高级编程》

    本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...

  8. Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程

    Shell高级编程视频教程-跟着老男孩一步步学习Shell高级编程实战视频教程 教程简介: 本教程共71节,主要介绍了shell的相关知识教程,如shell编程需要的基础知识储备.shell脚本概念介 ...

  9. unix环境高级编程基础知识之第二篇(3)

    看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...

  10. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

随机推荐

  1. Oracle 客户端安装 + pl/sql工具安装配置

    Oracle 客户端安装 +  pl/sql工具安装配置 下载oracle客户端,并在本地安装. 11g下载地址为: http://www.oracle.com/technetwork/databas ...

  2. maltab几个常见的问题

    maltab常见的几个习题 1. MATLAB 的命令窗口的作用是什么?编辑/调试窗口?图象窗口? MATLAB命令窗口是MATLAB起动时第一个看到的窗口,用户可以在命令窗口提示符"> ...

  3. 开通GitHub以及使用笔记

    把小游戏的代码和博客迁移到GitHub上,路径是:https://github.com/GAMTEQ,欢迎访问 以下是使用GITHUB的一些命令 504  cd code 506  mkdir Fai ...

  4. [GRYZ2015]INCR

    题目描述 数列 A1,A2,...,AN,修改最少的数字,使得数列严格单调递增. 输入格式 第 1 行,1 个整数 N 第 2 行,N 个整数 A1,A2,...,AN 输出格式 1 个整数,表示最少 ...

  5. MapReduce的执行过程.

    作业在运行时,数据或者是作业调用的一个运行图. 用户写的代码通过JobClient提交给JobTracker Job对象中封装了JobClient JobConf和我们的Job对象几乎是一回事. 把我 ...

  6. CORBA

    公共对象请求代理体系结构(Common Object Request Broker Architecture)

  7. 恒天云单节点部署指南--OpenStack H版本虚拟机单节点部署解决方案

    本帖是openstack单节点在虚拟机上部署的实践.想要玩玩和学习openstack的小伙伴都看过来,尤其是那些部署openstack失败的小伙伴.本帖可以让你先领略一下openstack的魅力.本I ...

  8. Spring+Quartz 整合二:调度管理与定时任务分离

    新的应用场景:很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们 ...

  9. HDU 5791 Two (DP)

    Two 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 Description Alice gets two sequences A and ...

  10. internet访问局域网内部方法之----------路由器端口映射

    很多人每天都问为什么要端口映射?例如:通过路由器上网的,网站自己可以访问,但是别人就不能:输入127.0.0.1可以访问,别人还是看不到:输入localhost可以看到,但是别人就是看不到,气人啊-没 ...