【C&C++】内存管理1:new + delete

前言

之前我们学习过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修饰 不代表他就是常量 他是常变量
【C&C++】内存管理1:new + delete_第1张图片

填空题

40
5 4
4 or 8 4
4 or 8 4

内存分布

【C&C++】内存管理1:new + delete_第2张图片

  • 分区是为了方便管理
  • 需要重点关注堆 因为内存空间的申请和释放都在这里

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;
}

总结

由于篇幅原因 这篇文章先写到这里 下篇文章继续~~

你可能感兴趣的:(C++知识点,c语言,c++,java)