New总结

new与malloc

开辟一个空间:

//c malloc与free   c++ new与delete
int *p = (int*)malloc(sizeof(int));
free(op);
op = NULLint *s = new int(10);
delete s; 
s = NULL;

开辟多个空间:

int main()
{
	int n = 10;
	int *p = (int *)malloc(sizeof(int)*n);
	int *s = new int[n](10); //vs 2019 ; c99可直接初始化
	free(p); p = NULL;
	delete []s;              //注意格式的书写
	return 0;
}
  1. malloc、new、free、delete功能
    malloc :开辟空间,不创建对象
    new:具有两个功能,(1) 堆区开辟空间 (2)调动构造函数,在空间中创建对象,并将10赋值(初始化)
    free:释放空间
    delete:具有两个功能,(1)调动析构函数,将对象的资源释放,(2)释放空间
  2. new(delete)与malloc(free)区别
    (1) malloc是函数,new不但是关键字,更是运算符,new可以重载,而malloc不能重载;
    (2) new不需要计算类型的大小,系统会自动进行计算,而malloc需要计算类型的大小,使用sizeof(类型);
    (3) 返回类型:malloc是无类型指针,需要强转,而new没有返回类型;
    (4) malloc只是开辟空间,而new在申请空间(不是创建空间,空间是由系统分配)之后,调动构造函数,创建对象;
    (5) 当malloc申请空间失败后,返回空指针,而new申请空间失败后,抛出异常:throw bad_alloc;
    (6) malloc释放空间,使用的是free,而new释放空间所使用的是delete,不能混乱使用;
    (7) free的功能只是释放空间,而delete的功能有两个,首先调动析构函数,将对象的资源释放之后,再释放空间
    (8) 对于开辟n个空间:
    malloc只是申请n个空间,并没有进行初始化,而new在申请多个空间的同时,创建多个对象并进行初始化
    在释放n个空间时,delete释放一组对象,格式:delete []s;

new的三种调动形式

new共有三种调动形式:

  1. 运算符调动(关键字调动)
  2. 函数调动
  3. 定位new
class Object
{
private:
	int value;
public:
	Object(int x=0):value(x)
	{
		cout<<"creat object"<<this<<endl;
	}
	~Object()
	{
		cout<<"destroy object"<<this<<endl;
	}
};

int main()
{
	Object *op = new Object(10);//运算符调动 2个功能
	delete op;                  //运算符释放 2个功能
	
	Object *os = (Object*)::operator new(sizeof(Object));//函数调动 1个功能
	::operator delete(os);                               //函数释放 1个功能
	
	new(os) Object(100);//定位new 1个功能
	os->~Object();      //调动析构函数
	
	return 0;
}

总结:

  1. 运算符调动:new具有两个功能(如上),用delete释放空间(功能如上);
  2. 函数调动:只是申请空间,功能和malloc相同,只有一处不同:malloc申请空间失败,返回空指针,而函数调动,抛出异常,throw bad_alloc。
    并且使用::operator delete(os)释放空间,不会调用析构函数;
  3. 定位new:不开辟空间,只是将Object所创建的对象放在os指向的空间,可以调用析构函数释放对象所占用的资源。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值