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:不仅能开辟内存还能初始化
new和delete,new[]和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修改而已
不可修改new:
const int* cpp=new const int(10);//而这种方式开辟的内存空间为常量内存块
delete cpp;
******************************************************************************
重定位new:
int 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()中存放总自己
new和new[] 以及在delete和delete[] 在不涉及对象的空间分配时是可以混用的。
对于 new test[10] 来说,如果test类型的大小是4字节,那么实际上new开辟的大小是44个字节,他会为了记录对象的
个数而单端开辟一个空间记录数值
如果new和delete开辟的是对象类型,则不能混用,这时因为 new test和new test[10]开辟的空间一个是4,而另一个是
44,同理在析构对象时,如果是对象数组,delete[] test 时,为了知道有几个对象,所以delete[] test这个循环调用
会把地址减4,得到对象的个数
如果是对象类型,那么new和delete[],new[]和delete
是不能混用的
new和delete
最新推荐文章于 2024-05-05 22:25:26 发布