前言
之前我们学习过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类型的空间并初始化为10
int* 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)); // C
int* 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;
}
总结
由于篇幅原因 这篇文章先写到这里 下篇文章继续~~