在c++中开辟内存,常用关键字new来开辟,new+类型 eg:int *p=new int;
new来分配内存时:(1)调用operator new 函数(对于数组是operator new[])分配一块足够大的、未名的内 存空间以便存储特定类型的对象。(2)编译器运行相应的构造函数以构造对象,并为其传入初值。(3)对 象构造完成后,返回一个指向该对象的指针。
用delete释放内存 ,delete+开辟内存变量名 eg:delete p;
在c语言中开辟内存,用malloc来开辟,malloc的原型是:void *malloc(size_t size);
用free来释放内存,free的原型是:void free(void *ptr);
二者区别:
(1)从开辟内存的位置上分:
new是从自由存储区域(自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区)开辟,malloc从堆上开辟。
(2)从内存开辟大小上分:
new是编译器会根据类型信息自行计算要开辟内存的大小,而直接分配,malloc是先需要手动用sizof计算内存开辟的大小,再来开辟。
(3)从初始化上看:
new除了可以开辟内存外,还同时进行初始化,而malloc只是单纯的开辟内存,不可以初始化。
(4)从返回值类型上看:
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故返回值类型安全;
malloc返回值类型不安全,由于底层函数是void *malloc(size_t size),内存分配成功则是返回void *,所以需要将void*指针强制类型转换成需要申请的类型,故不安全。
(5)从二者相互关系上看:
new是可以进行重载的,由于new开辟内存是调operator new来执行的,所以可以重载,而malloc不能重载。
new是可以调用malloc来开辟内存的,这也是向前兼容所导致的,而在用malloc开辟内存的时候,还没有new关键字,也不存在调用它。
new可以开辟常量,malloc不可以。
在new开辟常量类型时:一定要初始化,否则开辟的常量没有意义,也无法修改。 eg:const int *p=new const int (10);
new可以重定位:如下例:
int a;
char *p = new(&a) char('a'); //从a的内存中取一截内存来存放char 'a'
这说明了重定位是new分配的内存并不是“新分配”的,而是原先a的内存单元。因而不用释放delete p的内存,不能使用来释放资源。