内存管理
一.内存中的空间
1.栈:
局部变量
函数参数:调用函数所传入的参数(实参);
函数返回地址
临时对象
2.堆:
动态分配空间:单一的
动态数组:多个单一的
3.静态区:
全局变量
静态局部变量:在函数结束也不会销毁
静态成员
4.常量区:
字符串字面量
const修饰的常量
常量表达式 constexpr int SIZE = 10;
5.练习
globa在局部外面所以就是静态区 C;
同理 C;
虽然在函数内部但是被statatic修饰 C;
为局部变量 A;
依旧局部变量 A;
char2和数组一样A;
*char2其实就是a,那么肯定在A;
pchar3本身是存在栈的A;
*pchar3是指的是里面存的内容,这个存在常量区里面D;
ptr1和上面的类似,它本身是存在栈里面嘞A;
*ptr1是指里面的内容:是动态内存C;
二.. malloc/calloc/realloc的区别?
1.malloc
在堆上开辟一块空间
int* arr = (int*)malloc(5 * sizeof(int));
2.calloc
与malloc一样开辟一块空间,但是它会自动初话0;
int* arr = (int*)calloc(5, sizeof(int)); // 分配5个int,并初始化为0
3.realloc
当malloc或者callloc开辟的空间不够的时候就需要realloc来进行扩容
void* realloc(void* ptr, size_t new_size);
第一个参数是原来的空间,第二个是要扩的大小;
注意:一般来说会直接在原来空间的后面开辟,但是要是后面的空间大小不够了,就会开辟新的空间,原空间会被自动销毁。
三.new,delete
用malloc这些过于麻烦,并且当遇到自定义类写的时候就不可以使用,所以在C++中加入了新的开辟方式
1.内置类型
(1)new
new int[3]{1,2,3}
这是对于内置类型开辟的方法,和malloc比较会简单很多
(2)delet
2.自定义类型
(1)new
如图,最大的优势就是他可以自动调用构造函数进行初始化
开辟一个int类型的空间大小
开辟10个A类型的空间
此时初始化直接加
{1,2,3}这样就是隐式类型转化,1,2,3都被转换为A;
{A(1)}这样就是运用匿名对象
显然第一个更简单
(2).delet
注意:
(3)底层
new:开空间+构造函数;
new---》operator new---》调用malloc+抛异常
delete---》operatordelete——》调用free;
(4)区别
malloc/free为函数;
new/delete为操作符:
