C/C++内存管理笔记

目录

1.C/C++内存分布

2.C语言中动态内存管理方式

3.C++中动态内存管理

4.operator new和operator delete函数

5.定位new表达式

———————————————————————————————————————————

今天我们来聊一聊C/C++的内存管理

正文开始->

1.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) = ____;

现在我们来看一下这张图

可以看到

栈中存放的是非静态的局部变量/函数参数/返回值等,栈是向下增长的

堆是用来动态内存分配,开空间

数据段是储存全局变量,然后静态的数据

代码段就是常量,可执行的代码

2.C语言中动态内存管理方式

C语言中的内存管理用的是malloc/calloc/realloc/free,前三个都是用来开空间,free是用来释放空间,防止内存泄漏

函数malloc()和函数calloc()的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有 被使用过,则其中的每一位可能都是0;反之,如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开 始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。 

3.C++中动态内存管理

C 语言内存管理方式在 C++ 中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因
C++ 又提出了自己的内存管理方式: 通过 new delete 操作符进行动态内存管理
int main()
{
	//开四个int类型大小的空间
	int* p1 = new int[4];
	//开一个int类型的空间,并初始化为1
	int* p2 = new int(1);

	//释放p1指向的这块空间
	delete[] p1;
	//释放p2执行的这块空间
	delete p2;
	return 0;
}

下面来说说new和delete对于自定义类型申请空间

class A
{
public:
	A(int a =-1)
	{
		_a = a;
		cout << "构造" << endl;
	}
	~A()
	{
		cout << _a << endl;
		cout <<"析构" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p1 = new A(1);
	delete p1;
	return 0;
}

这段程序运行后的结果是

可以看到new和delete的时候分别调用了自定义类型的构造函数和析构函数

所以得出:在申请自定义类型的空间时, new 会调用构造函数, delete 会调用析构函数,而 malloc free 不会

4.operator new和operator delete函数

new和 delete 是用户进行 动态内存申请和释放的操作符 operator new operator delete是
系统提供的全局函数 new 在底层调用 operator new 全局函数来申请空间, delete在底层通过
operator delete全局函数来释放空间。

这里其实operator new 实际也是通过malloc来申请空间,如果 malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施 就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的

所以得出:new就是operator new+构造,delete是operator delete +析构

5.定位new表达式

定位 new 表达式是在 已分配的原始内存空间中调用构造函数初始化一个对象
使用格式:
new (place_address) type 或者 new (place_address) type(initializer-list)
place_address 必须是一个指针, initializer-list 是类型的初始化列表
使用场景:
定位 new 表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如
果是自定义类型的对象,需要使用 new 的定义表达式进行显示调构造函数进行初始化。

         

希望大家多多支持谢谢咯😁😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值