new和delete

malloc :void* malloc(size_t size);
	1.返回值类型不安全
	2.开辟内存由使用者控制空间浪费或者不足
free :void free(void*)

int main()
{
	int *p=(int*)malloc(sizeof(int));
	if(p==null)
	{
		exit(0);
	}
	free(p);

	int**p=(int**)malloc(sizeof(int*)*3);//C语言动态开辟二维数组
	for(int i=0;i<3;i++)
	{
		p[i]=(int*)malloc(sizeof(int)*4);
	}
}


new:不仅能开辟内存还能初始化
newdeletenew[]delete[]要一一对应	
int main()
{
	int *p=new int(0);
	delete p;

	int *arr=new int[10];
	delete[] arr;

	int **arr=new int*[3]();//动态开辟二维数组
	for(int i=0;i<3;i++)
	{
		arr[i]=new int[4];
	}
	for(int i=0;i<3;i++)
	{
		delete [] arr[i];
	}
	delete [] arr;
}


int *p=new int;//这行代码一公开辟了8个字节内存分别在栈和堆上各有四个。
那么为什么不能直接操作堆内存而是要通过指针的方式间接操作堆内存?
答:动态开辟的堆内存是没有变量名的,所以无法直接操作,所以只能把堆内存的所有权交给
一个栈上的指针来进行管理
******************************************************************************
int *cp=(int*)malloc(sizeof(int));
if(cp==NULL)//这时C语言的判空处理
{
	exit(0);
}
free(cp)
但是在c++中这样判断是无法成功的,在c++中内存不足会抛出异常,所以需要进行异常捕获
******************************************************************************
const int* p=(int*)malloc(sizeof(int));//这并不能让堆上开辟的内存块成为常量内存单元
free(p);                               //只是不能通过*p修改而已

不可修改newconst int* cpp=new const int(10);//而这种方式开辟的内存空间为常量内存块
delete cpp;
******************************************************************************

重定位newint main()
{
	int a;
	char *c=new (&a) char('a');//将a的第一个字节用来开辟空间
}
说明new不仅仅可以从堆上开辟内存空间,还能从栈上开辟
new开辟的空间叫做自由存储区

******************************************************************************
总结 new和malloc的区别
1.new是一个关键字。malloc是一个函数
2.new是返回值类型安全的,malloc返回值不安全
3.new不需要计算开辟内存大小,malloc需要计算
4.new开辟异常抛出异常,malloc返回NULL
5.new能做初始化,而malloc只能开辟内存
6.new开辟的内存叫做自由存储区,malloc在堆上
7.new[] 中括号中存放大小,malloc()中存放总自己







	newnew[] 以及在deletedelete[]  在不涉及对象的空间分配时是可以混用的。
	对于 new test[10] 来说,如果test类型的大小是4字节,那么实际上new开辟的大小是44个字节,他会为了记录对象的
	个数而单端开辟一个空间记录数值
	如果newdelete开辟的是对象类型,则不能混用,这时因为 new test和new test[10]开辟的空间一个是4,而另一个是
	44,同理在析构对象时,如果是对象数组,delete[] test 时,为了知道有几个对象,所以delete[] test这个循环调用
	会把地址减4,得到对象的个数

如果是对象类型,那么newdelete[],new[]delete
是不能混用的















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值