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在哪里?__C__ staticGlobalVar在哪里?__C__
staticVar在哪里?__C__ localVar在哪里?__A__
num1 在哪里?__A__
char2在哪里?__A__ *char2在哪里?_A__
pChar3在哪里?_A___ *pChar3在哪里?__D__
ptr1在哪里?__A__ *ptr1在哪里?__B__

在这里插入图片描述
在这里插入图片描述
2.C++内存管理方式
C++是兼容C的内存管理方式的,但是由于有不方便的地方。
于是C++提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

2.1 new/delete操作内置类型
new和delete都是操作符,不是函数。
new的常见使用方式:
1.动态申请一个int类型的空间
ptr1 = new int;
2.动态申请一个int类型的空间,并初始化为10
ptr2 = new int(10)
3.动态申请10个int类型的空间。
ptr3 = new int[10]
4.动态申请10个int类型的空间,并进行赋值。
ptr4 = new int[10]{1,2,3}
new不只是能申请 int类型,其他类型也是可以申请的。

动手练练:

int* p1 = new int;
int* p2 = new int[5];
int* p3 = new int(5);
int* p4 = new int[5]{1,2,3};
从内存空间的角度更容易看清楚一些。

在这里插入图片描述
在这里插入图片描述

delete:
释放单个空间:
delete ptr1
delete ptr2
释放多个空间:
delete[] ptr3
delete[] ptr4

delete p1;
delete[] p2;
delete p3;
delete[] p4;
注意:new []delete[]一定要匹配,不然会报错

在这里插入图片描述

3.new和malloc最大的区别。(重点)

最大的区别在于 new在为自定义类型开辟空间的同时,会调用构造函数,delete会调用析构函数。而malloc只会开辟空间。

对于内置类型,new和malloc没有本质区别,只有用法上的区别。
只是new在用法上进行了简化。

但 new没有类似于 relloc之类的功能。

举个例子:

class A
{
public:
	A():data(0)
	{}
private:
	int data;
};
int main()
{
	A* A1 = (A*)malloc(sizeof(A));
	A* A2 = new A;
	return 0;
}
分别通过 malloc和new开辟空间。
通过下面的图可以看出,malloc开辟的空间并没有调用构造函数。
而new的话,是会调用构造函数的。
这也是new和malloc最本质的区别。

在这里插入图片描述
4.new与malloc报错的方式。
new报错的方式是不需要检查返回值,失败是抛异常。
而malloc报错的方式是返回NULL.
通常情况下 开辟空间不会失败,除非开辟空间很大(超过了最大值)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值