new、delete

概念

  • new和delete是C++中的操作符
  • new和delete是在自由存储区(可以理解为堆)上开辟空间,所以也需要手动释放


C与C++使用对比

  1. 申请、释放 一个 int 空间
c中的写法

int* p =(int*)malloc(sizeof(int));
*p=10;

if(p!=NULL)
{
	free(p);
	p=NULL;
}



cpp中写法

int* p = new int;
*p = 10;
if(p !=NULL)
{
	delete p;
	p=NULL;
}

 
 int* p =new int(10);//将申请的空间初始化为10

  1. 申请、释放 一个数组
c中的写法

int *p =(int*)malloc(sizeof(int)*10);
for(int i=0; i<10; i++)
{
	p[i]=i;
}
if(p !=NULL )
{
	free(p);
	p=NULL;
}





cpp中写法

int* p = new int[10]
for(int i=0; i<10; i++)
{
	p[i]=i;
}
if(p !=NULL )
{
	delete[]p;
	p=NULL;
}



malloc、free和new、delete之间的区别

  1. malloc、free是stdlib里面的标准库函数;但是new、delete是C++中的操作符,效率高一点,底层调用了malloc/free。
  2. malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型的大小对应类型的指针。
  3. 在创建一个对象的时候,new和delete能够触发构造函数和析构函数,但是malloc和free不行。

举例:如果对象中有指针,指针初始化时候在堆上开辟了空间,最后需要在析构中释放,delete能够触发析构;但是用free,在堆上开辟的对象空间释放了,但是对象成员的指针指向的空间泄露了。


class Person
{
public:
	Person() //无参构造
	{
		m_a =1;
		m_b =2;
		ptr = new int;  //在堆上又开辟空间
	}

	Person(int a, int b) //有参构造
	{
		m_a =a;
		m_b =b;
		ptr = new int;  //在堆上又开辟空间
	}

	~Person()
	{
		if(ptr!=NULL)
		{
			delete ptr;
			ptr=NULL;
		}
	}
private:
	int m_a;
	int m_b;
	int * ptr;
};


Person* p= new Person  //触发无参构造
Person* p= new Person(10,20) //触发有参构造  

delete p // 空间全部释放
free p //  ptr指向的堆的空间泄露了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值