前言
之前我们学习过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";const 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. 选择题:选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里?____ staticGlobalVar在哪里?____staticVar在哪里?____ localVar在哪里?____num1 在哪里?____char2在哪里?____ * char2在哪里?___pChar3在哪里?____ * pChar3在哪里?____ptr1在哪里?____ * ptr1在哪里?____
2. 填空题:sizeof(num1) = ____;sizeof(char2) = ____; strlen(char2) = ____;sizeof(pChar3) = ____; strlen(pChar3) = ____;sizeof(ptr1) = ____;
3. sizeof 和 strlen 区别?
选择题
静态区:全局变量 + 局部静态 + 全局静态
栈:数组名(代表整个数组) + 函数栈帧
CCC
AA
AAA
DAB
const修饰 不代表他就是常量 他是常变量
填空题
40
5 4
4 or 8 4
4 or 8 4
内存分布
- 分区是为了方便管理
- 需要重点关注堆 因为内存空间的申请和释放都在这里
C语言动态内存管理:malloc/calloc/realloc/free
void Test(){int* p1 = (int*)malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么?int* p2 = (int*)calloc(4, sizeof(int));int* p3 = (int*)realloc(p2, sizeof(int) * 10);// 这里需要free(p2)吗?free(p3);//不需要 这里是原地扩容(有足够大的空间) 不是异地扩容(会直接释放p2)}
拓展:
malloc的实现原理?
glibc中malloc实现原理
C++内存管理:new delete
好处:
- 更简洁
- 可以进行初始化
- 自动调用构造和析构函数
- 构建失败会自动抛出异常“代码为n” (就不用自己写perror了)
给出一段参考代码
try
{func();
}
catch(const ex.ception& e)
{cout << e.what() << endl;
}
//看不懂 阿巴阿巴 之后会学
new/delete操作内置类型
void Test(){// 动态申请一个int类型的空间int* ptr4 = new int;// 动态申请一个int类型的空间并初始化为10int* ptr5 = new int(10);// 动态申请10个int类型的空间int* ptr6 = new int[10];delete ptr4;delete ptr5;delete[] ptr6;}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用
new[]和delete[]
操作自定义类型
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间
还会调用构造函数和析构函数
class A {
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}
private:
int _a;
};
int main()
{A* p1 = (A*)malloc(sizeof(A));A* p2 = new A(1);free(p1);delete p2;// 内置类型是几乎是一样的int* p3 = (int*)malloc(sizeof(int)); // Cint* p4 = new int;free(p3);delete p4;A* p5 = (A*)malloc(sizeof(A) * 10);A* p6 = new A[10];free(p5);delete[] p6;return 0;
}
总结
由于篇幅原因 这篇文章先写到这里 下篇文章继续~~