1.new的三种用法
1)new运算符的使用
int *ipa=new int(10);//不加括号放弃对其初始化;加括号但括号为空即不加10,用0初始化;也可加花括号初始化
//1.自动计算int类型的大小
//2.调动malloc函数从堆区申请空间,开辟4个字节空间一个整型空间
//3.申请空间成功后用括号中的10对int开辟的空间初始化成10
//4.初始化完成之后将地址返回给ipa
int *is=new int[10]{1,2,3,4,5,6};//开辟一组空间,大小为10个
int *ir=new int[]{1,2,3,4,5};
delete ipa;//free(ipa);
ipa=NULL;
delete[]is;
delete[]ir;
2)new函数方式的使用
int main()
{
int n=10;
int *ipa=(int *)::operator new(sizeof(int));
// (int *)malloc(sizeof(int));
int *ipb=(int *)::operator new(sizeof(int)*n);
// (int *)malloc(sizeof(int)*n);
::operator delete(ipa);
::operator delete[](ipb);
//::operator delete(ipb);错误,因为是一组空间要加[],并且释放之后一定要变成空指针,消除失效指针
ipa=nullptr;
ipb=nullptr;
}
3.定位new的使用
int main()
{
int n=10;
//int *ipa=(int *)::operator new(sizeof(int));
int *ipa=(int *)malloc(sizeof(int));
int *ipb=(int *)::operator new(sizeof(int)*n);
// (int *)malloc(sizeof(int)*n);
new(ipa)int (20);
new(ipb)int[]{1,2,3,4,5,6,7,8,9}
free(ipa);
::operator delete[](ipb);
//::operator delete(ipb);错误,因为是一组空间要加[],并且释放之后一定要变成空指针,消除失效指针
ipa=nullptr;
ipb=nullptr;
}
2.new和malloc的区别
1)new/delete是C++中的运算符,malloc/free是函数
2)malloc申请内存空间时,手动计算所需要的大小,new只需要类型名,自动计算大小;
3)malloc申请的内存空间不会初始化,new申请的内存空间可以初始化;
4)malloc的返回值为void*,接收时必须强转,new不需要;
5)malloc申请内存空间失败时,返回的是NULL,使用时必须判空,new申请内存空间失败时抛出异常,所有要有捕获异常处理程序。