目录
一.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》