【C++】内存管理

1. new 和 delete 的基本使用

int main()
{
    //内置类型 :开空间+不初始化
	int* p1 = new int;
	int* p2 = new int[10];        

	// 开空间+初始化
	int* p3 = new int(10);     
	int* p4 = new int[10]{1,2,3};  //其余7个int都为0
	int* p5 = new int[10]{};       //10个int都为0

    delete p1,p3;
	delete[] p2;
    delete[] p4;
    delete[] p5;

    
    
    
	// 自定义类型,开空间+调用构造函数初始化
	A* p6 = new A;
	A* p7 = new A(3);
	
	// 自定义类型,调用析构函数+释放空间
	delete p6,p7;




	A* p4 = new A[10];
	delete[] p4;                //开了一个10个A容量的数组

	A aa1(1);
	A aa2(2);
	A* p8 = new A[10]{aa1, aa2};
	delete[] p8;


	A* p9 = new A[10]{ A(1), A(2)};   //其余8个为0
	delete[] p9;

	A* p10 = new A[10]{ 1, 2 };       //其余8个为0
	delete[] p10;



	return 0;
}

2. operator new与operator delete函数

operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;当申请空间失败,尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。(相当于malloc + 抛异常)

各函数的原理:

  • operator new:malloc + 抛异常
  • operator delete :free
  • new:operator new +构造函数
  • delete:析构函数 + operator delete
  • new T[N]:
    operator new[]函数(调用operator new函数完成N个对象空间的申请)+
    在申请的空间上执行N次构造函数
  • delete[]:N次析构函数 + operator delete[](实际上operator delete[]中是调用operator delete来释放空间)

3. 定位new表达式(placement-new)

int main()
{
	// 内存池
	Stack* pst1 = (Stack*)operator new(sizeof(Stack));
	//pst1->Stack(4); // 不支持直接显示调用构造函数
	new(pst1)Stack(4); // 支持这样显示调用构造函数
	//这3行等价于new

	pst1->~Stack();   //析构函数支持直接显示调用
	operator delete(pst1);
	//这2行等价于delete

	return 0;
}

4. malloc/free和new/delete的区别

用法不同:

  • 返回值不同,malloc 是 void* ,需要强转,new后跟的是空间的类型
  • malloc 手动计算空间大小,new 不用
  • 若失败,malloc 返回 NULL,new 捕获异常
  • malloc和free是函数,new和delete是操作符

底层原理:
申请自定义类型对象时,malloc/free 只会开辟/释放空间 ,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。

5. C/C++内存分布

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值