知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技

【C++自学笔记】C/C++内存管理

发表时间:2022-03-25来源:网络

一、C/C++内存分布

先看一段C语言代码:

int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); }

1、所在内存区域

globalVar->数据段(静态区)

staticGlobalVar->数据段(静态区)staticVar->数据段(静态区)localVar->num1-> char2->栈(栈帧)*char2->栈(栈帧)pChar3->栈(栈帧)*pChar3->代码段ptr1->栈(栈帧)*ptr1->

2、sizeof 和 strlen 

sizeof(num1) = 40sizeof(char2) = 5sizeof(pChar3) = 4 / 8sizeof(ptr1) = 4 / 8strlen(char2) = 4strlen(pChar3) = 4

3、C/C++中程序内存区域划分 

                                                            

栈:又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的;

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

堆:用于程序运行时动态内存的分配,堆是向上增长的;

数据段:存储全局数据和静态数据;

代码段:可执行的代码 / 只读常量;

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

1、malloc / calloc / realloc 和 free

void Test() { int* ptr1 = (int*)malloc(sizeof(int)); free(ptr1); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 10); free(ptr3); }

注意:ptr2不需要释放,因为 realloc 只是对 ptr2的原有基础上进行了扩容,实际上用的是同一块内存空间;

2、malloc / calloc / realloc 的区别

共同点:都是程序猿从堆上申请空间的方法,并且需要手动释放或者在程序结束运行的时候自动释放,否则会造成内存泄露;

malloc:分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间;

calloc:将初始化这部分的内存;

realloc:则对malloc 、 realloc 申请的内存进行大小的调整;

3、alloca

alloca是从上申请内存空间,且不需要释放,由系统自动释放;

三、C++内存管理方式

1、new / delete 操作内置类型

void Test() { int* ptr1 = new int; int* ptr2 = new int(10); int* ptr3 = new int[3]; delete ptr1; delete ptr2; delete[] ptr3; }

                                                       ptr1 ==> 动态申请了一个int类型的空间;

                                                       ptr2 ==> 动态申请了一个int类型的空间并初始化为10;

                                                       ptr3 ==> 动态申请了一个int型数组,数组大小是在[ ]中指定

注意:申请和释放单个元素的空间,使用 new 和 delete 操作符;申请和释放连续空间,使用 new[ ] 和 delete[ ];

2、new / delete 操作自定义类型

class TestT { public: TestT() :_data(0) { cout
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜