【C++内存管理】

内存分布

在这里插入图片描述
1.栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
3.堆用于程序运行时动态内存分配,堆是可以上增长的。
4.数据段–存储全局数据和静态数据。
5.代码段–可执行的代码/只读常量。

C++内存管理方式

new/delete操作内置类型

void Test()
{
	// 动态申请一个int类型的空间
	int* ptr4 = new int;
	// 动态申请一个int类型的空间并初始化为10
	int* ptr5 = new int(10);
	// 动态申请10个int类型的空间
	int* ptr6 = new int[10];
}

对数组开辟空间的同时,也可以进行赋值操作。

int* ptr6 = new int[10]{1234};

和free对应的是delete

delete ptr4;
delete ptr5;
delete[] ptr6;  //对数组

new和delete操作自定义类型

内置类型用new和malloc没啥区别,但是自定义类型呢?

class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << this << endl;
	}

	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
	int _a;
};

我们定义一个自定义类型的类。
这里我们发现,malloc之后想要赋值,但是变量在private中拿不出来。

A*p1=new A;
A*p2=new A(2);   //没有默认构造就用带参的构造

delete p1;

new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数

如果不想调用默认的默认构造

A aa1(3);
A aa2(4);
A*p3=new A[5]{aa1,aa2};
A*p4=new A[5]{1,2,3,4{567}};  //匿名对象,先生成临时对象,再拷贝构造

但是C++没有类似realloc的功能,要手动扩容。

operator new与operator delete函数

operator new函数底层是malloc,所以new就是operator new函数+构造函数
operator delete也类似,delete相当于析构函数+operator delete函数。
这里注意,比如

A* p4 = new A;
delete p4;

析构的是A的内容,对资源的清理,而operator delete的是p4指向的空间。
在这里插入图片描述
这里为什么要用这俩函数代替malloc和free呢?
malloc我们每次用完,都要检查一遍。
operator new 实际也是通过malloc来申请空间,如果malloc申请空间
成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常operator delete 最终是通过free来释放空间的。

注意:
free和new不要混着用

为了实现对称,在new多个对象的时候,new A[N]调用的是operator new[]函数+N次构造函数。

开辟多个对象的细节

我们开一个空间

void main()
{
	A*p2=new A[10];
	delete[] p2;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
p2的起始位置和最后压栈的位置为什么不一样呢?差了四个字节。
这是因为最后delete的时候,要把所有的都free,而头上开了四个字节,是为了存开的个数,知道要delete几次。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值