C++动态内存管理

1:总结并剖析malloc/free和new/delete之间关系和差异。 

1)他们都是动态内存管理的入口
2)malloc要计算空间大小,返回值要强转
  new自动计算字节大小,返回值是相应类型的指针
3)malloc只开辟空间
  new开辟空间+调用构造函数初始化
  delete调用析构函数清理+释放空间
4)malloc是库函数
  new是操作符
5)malloc失败返回0
  new失败返回包异常




2:剖析new/delete、new[]/delete[]到底做了些什么事情。 
new:
1)调用operator new 开辟空间
2)调用构造函数初始化

3)返回该指针


delete:

1)调用析构函数进行清理工作
2)调用 operator delete 释放空间

new[]:
1)调用operator new[]开辟空间,多开辟4字节空间保存数组对象个数
2)每个对象分别调用构造函数初始化
3)返回数组指针


delete[]:
1)指针前移获取数组对象个数n,调用n次析构函数

2)调用 operator delete[] 释放空间


3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组

NEW_ARRAY:

1)在PTR上开辟一个N个TYPE类型元素+4字节的空间

2)在该空间前4个字节保存对象的个数,为了delete[]做准备

3)PTR指针后移4字节,调用定位new的表达式进行初始化操作

#define NEW_ARRAY(PTR, TYPE, N)						\
do{									\
	PTR = (TYPE*)operator new (sizeof(TYPE)*N + 4);			\
	*((int*)PTR) = N;						\
	PTR = (TYPE*)((int*)PTR+1);					\
	for(int i=0; i<N; i++)						\
	{								\
		new(PTR+i)(TYPE);					\
	}								\
}while(false);


DELETE_ARRAY:

1)在数组前4个字节读取元素个数N

2)把每个对象进行析构函数调用

3)释放空间

#define DELETE_ARRAY(PTR, N)		\
do{					\
	N = *((*int)PTR - 1);		\
	int i = 0;			\
	for(i=0; i<N; i++)		\
	{				\
		PTR[i].~TYPE();		\
	}				\
	PTR = (TYPE*)((int*)PTR-4);	\
	operator delete PTR;		\
}while(false);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值