大家好,我是苏貝,本篇博客带大家了解C++的内存管理,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 1.C/C++内存分布
- 2. C语言中动态内存管理方式:malloc/calloc/realloc/free
- 3. C++内存管理方式
- 3.1 new/delete操作内置类型
- 3.2 new和delete操作自定义类型
- 3.3 对比C/C++写单链表的创建节点
1.C/C++内存分布
我们在语法上会说有:栈、堆、静态区、常量区
在OS层面会说:栈、堆、数据段、代码段
【说明】
- 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
- 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以向上增长的。
- 数据段–存储全局数据和静态数据。
- 代码段–可执行的代码/只读常量
我们先来看下面的一段代码和相关问题
问:
前5个(从左到右):CCCAA
全局变量和static变量放在(数据段)静态区(前3个)
局部变量放在栈区(第四个)
Num1是局部的数组,它的值是首元素地址,局部数组在栈区
后5个(从左到右):AAADAB
前2个:char2是局部的数组,它的值是首元素地址,局部数组在栈区。”abcd”在常量区,实际上是”abcd\0”。将”abcd\0”赋值给数组,是将常量区的”abcd\0”赋值一份到栈区,再让数组指向栈区的“abcd\0”(看下图)。char2的值是首元素地址,*char2就是首元素a,在栈区。
中间2个:
pChar3是局部的指针,指向常量区的”abcd”(实际上是”abcd\0”)。所以pChar3在栈区,* pChar3是找到pChar3指向的内容,即常量区的”abcd\0”。
最后2个:
ptr1是局部的指针,指向malloc在堆上开辟的空间。因此ptr1在栈区,*ptr1在堆区
问:
2. C语言中动态内存管理方式:malloc/calloc/realloc/free
-
malloc/calloc/realloc的区别
malloc开辟的空间不会初始化。calloc开辟的空间会将每个字节初始化为0。realloc可以调整开辟空间的大小(不初始化为0),调大空间:原地扩容(后面有足够空间)或者异地扩容(后面无足够空间,另外找一个足够的连续空间)。 -
这里需要free(p2)吗?
不用,如果要异地扩容,那么realloc会自动free掉p2指向的空间。如果是原地扩容,free(p3)即可。
3. C++内存管理方式
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
3.1 new/delete操作内置类型
new 类型后面没有接[类型个数],默认申请1个该类型的空间
申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[ ]和delete[ ],注意:匹配起来使用。
所以new和malloc的区别在哪里?
- 用法上更简洁,如上
- 可以控制初始化
给多个连续的元素初始化,如果初始值的个数少于元素的个数,那么没有初始值的元素就被初始化为0
3.2 new和delete操作自定义类型
- 在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会。
- new失败后会抛异常,不需要我们手动检查
3.3 对比C/C++写单链表的创建节点
C
C++
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️