C/C++ 内存管理(上)

目录

一.C/C++内存分布

栈:

内存映射段:

堆:

数据段:

代码段:

二.C语言中动态内存管理方式

三.C++内存管理方式

使用new来分配内存

使用delete释放内存


一.C/C++内存分布

栈:

(又名堆栈)用来储存非静态局部变量、函数参数、返回值等

内存映射段:

高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。

堆:

由程序员编写代码去控制分配和释放,一般放的是指针。

数据段:

存储全局数据和静态数据

代码段:

可执行的代码、只读常量

二.C语言中动态内存管理方式

分配内存:malloc()和 free()

malloc()函数会找到合适的空闲内存块,这样的内存是匿名的,并不会为其赋名。然而,它确实返回动态分配内存块的首字节地址。因此,可以把该地址赋给一个指针变量,并使用指针访问这块内存。

例:

int * ptd;
ptd = (int *) malloc(10 * sizeof(int));

静态内存的数量在编译时是固定的,在程序运行期间也不会改变。动态分配的内存数量只会增加,除非用free()函数进行释放,否侧将会造成内存泄漏(memory leak)

分配内存还可以使用calloc(),与malloc()类似,但存在一些区别,其函数原型

void *calloc(size_t n, size_t size)  比malloc()函数多了一个参数,这样就省去了人为空间计算的麻烦。

但是最主要也是最重要的区别在于malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0

还有一个用于分配内存的函数 realloc()

它与上面两个有着本质上的区别,其原型为void realloc(void *ptr, size_t new_Size)
realloc()用于对动态内存进行扩容。及已申请的动态空间不够使用,需要进行空间扩容操作。

三.C++内存管理方式

使用new来分配内存

int * pn = new int;

其原理大致为在运行阶段为一个int值分配未命名的内存,并使用指针来访问这个值,程序员告诉new,需要为哪种数据类型分配内存,new将找到一个长度正确的内存块,并返回该内存块的地址

也可以new来创建动态数组

使用delete释放内存

int * pn = new int;
delete pn;

当程序员需要内存时可以使用new,当不再需要后可以使用delete,它可以将使用后的内存归还给内存池。

如上诉代码,第二行的代码将会释放pn所指向的内存,但并不会删除指针pn本身

(!警告 不要释放已释放过的内存块)

参考:《C Primer Plus》 《C++ Primer Plus》

calloc、malloc、realloc函数的区别及用法_魏波.的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值