内存问题:(代码区,全局栈区,堆,局部栈区)free malloc new delete

(1)代码测试:

#include <unistd.h>
int add(int a,int b)
{
return a+b;
}
int a1 =1;//全局栈区
static int a2 =2;//全局栈区
const int a3 =3;//代码区
main()//main函数地址,代码区
{
  int b1 =4;//局部栈区
  static b2 = 5;//全局栈区
  const b3 = 6;//局部栈区
  int *p1 = malloc(4);//p1:堆区

printf("%d\n",getpid());
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("main:%p\n",main);
        printf("add:%p\n",add);
        printf("p1:%p\n",p1);
while(1);
}
   

//打印输出结果:

a1:0x80497e4
a2:0x80497e8
a3:0x80485f4
b1:0xbfd15148
b2:0x80497ec
b3:0xbfd15144
main:0x8048432
add:0x8048424
p1:0x874d008


cd /proc

pa aue   //查看所有的用户可执行进程

cd 3647


ls -l exe

ls -l cwd

cat maps

ladd main(可执行文件名称)

(2)内存管理1:依次是:

[root@kuenking 3647]# cat maps
00580000-00581000 r-xp 00000000 00:00 0          [vdso]
00701000-0071f000 r-xp 00000000 fd:00 1326103    /lib/ld-2.12.so
0071f000-00720000 r--p 0001d000 fd:00 1326103    /lib/ld-2.12.so
00720000-00721000 rw-p 0001e000 fd:00 1326103    /lib/ld-2.12.so
00727000-008b3000 r-xp 00000000 fd:00 1326114    /lib/libc-2.12.so
008b3000-008b5000 r--p 0018c000 fd:00 1326114    /lib/libc-2.12.so
008b5000-008b6000 rw-p 0018e000 fd:00 1326114    /lib/libc-2.12.so
008b6000-008b9000 rw-p 00000000 00:00 0 
08048000-08049000 r-xp 00000000 fd:00 261916     /root/桌面/test   代码区
08049000-0804a000 rw-p 00000000 fd:00 261916     /root/桌面/test  全局栈区
0874d000-0876e000 rw-p 00000000 00:00 0          [heap]
b7777000-b7778000 rw-p 00000000 00:00 0 

b778d000-b778f000 rw-p 00000000 00:00 0 
bfd01000-bfd16000 rw-p 00000000 00:00 0          [stack]

1:代码区: 红色;

2:全局栈区:蓝色;

3:堆:    绿色;

4:局部栈区:黄色;

/关于理解malloc 的工作原理:

1;malloc 使用的是一个数据结构(链接),维护分配空间

链表的构成:分配的空间/上一个空间数据/下一个数据空间/空间的大小等信息

对malloc分配的空间不要越界访问,因为容易导致malloc /realloc/calloc/free /等释放就会可能造成程序出问题了。(奔溃)。

///CPP的new 和malloc的关系

malloc                  new              new[]

realloc    new()    定位分配

eg:定位分配

         char p[20];
 
             int *p = new(p)int;

定位分配意思是:对于已有的分配空间,如果不够,可以重新分配,首先释放之前已经分配的空间,然后重新分配空间大小;

calloc                   new[]    就是数组分配

free                      delete           delete[]

1。new 的实现使用的是malloc来实现的,

区别:new的使用malloc后,还要初始化空间,基本类型,直接初始化默认值UDT类型,调用指定的构造器!

2.delete 调用free实现,delete 负责调用析构器,然后再调用free。

3、new 和new[]

new只调用一次构造器初始化,new[]则调用的是多次,循环对每个区域调用构造器。

4.delete 和delete[]

delete 和delete[]都会析构 ,释放首地址,但是delete[]会知道知道释放类似int *p = new int[20];   delete[],会自动知道释放后面的20个;

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

 @@         @@ @@@@ 

       @@    @@

变量类型声明的位置是否存于堆栈 作用域如果声明static
全局  所在代码之外  从声明到文件  尾不允许从其他源文件访问
局部代码块起始处整个代码块变量不存储与堆栈中,他的值在程序整个执行期一直保持
形式参数函数头部整个函数不允许

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值