内存管理层次:

   硬件层次:
内存结构管理
内核算层次:
内存映射
堆扩展
数据结构层次:
智能指针:
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. Delphi的windows剪切板操作函数

    1. Clipbrd函数 function Clipboard: TClipboard;:若应用程序从未使用过剪贴板,则调用该函数形成新的剪贴板:若之前使用过剪贴板则返回使用过的剪贴板. 属性: As ...

  2. HDU5787 K-wolf Number 数位dp

    分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...

  3. 《Python 学习手册4th》 第六章 动态类型简介

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书)“重点笔 ...

  4. python多线程ctrl-c退出问题

    场景: 经常会遇到下述问题:很多io busy的应用采取多线程的方式来解决,但这时候会发现python命令行不响应ctrl-c 了,而对应的java代码则没有问题: public class Test ...

  5. Standalone HBase

    This is the default mode. Standalone mode is what is described in the quickstart section. In standal ...

  6. The Administration Console(管理员控制台)

    当你的应用准备好了首次露面时,你要创建一个管理员用户以及将这个应用安装到App Engine上.你使用你的管理员帐户创建和管理这个应用,查看它的资源利用统计,消息日志以及更多.所有这些基于一个叫做管理 ...

  7. mongodb 新建用户 -摘自网络

    随着版本的更新,对在使用mongodb的业务也进行了版本升级,但是在drop掉一个数据库时,问题来了,原来的用户随着删除库也被删除掉,但是再想通过原来的语法db.addUser()添加,一直报错,提示 ...

  8. 第二百九十七天 how can I 坚持

    算是在家宅了一天吧,下午睡了会觉,晚上一起做了个饭,中午一起吃的炒菜和徐斌他同学. 还是那么冷啊. 整天都是东扯西扯的. 睡觉. 忘了件重要的事,就是今天第一次喝鸡尾酒,还有,常人之所以是常人,不是因 ...

  9. 转载.net泛型理解说明

    net泛型理解 泛型简介: 泛型(Generic Type)是.NET Framework2.0最强大的功能之一.泛型的主要思想是将算法与数据结构完全分离开,使得一次定义的算法能作用于多种数据结构,从 ...

  10. iOS类别(Category)

    iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最 ...